電子書籍の厳選無料作品が豊富!

C言語で文字列のヌルについて、理解があいまいな点があり、教えて欲しいのですが、以下のようにsprintfで書式し代入した際に最後は0(ヌル文字)をセットしてくれるのでしょうか?4バイト目の文字が何か知りたいです。
char temp[100];時では0で初期化されていることは保障されていませんが、大抵は0で埋まっていますが、sprintfの仕様が知りたいです。

char temp[100];
sprintf(temp, "test");とした時に

01234バイト目
test?????????????....



話は変わりますが、以下のようにするとエラーになりましたが、
特定の位置の値をセットする方法はどのようなものがあるのでしょうか?

temp[10] = (temp[10] == '0') ? (char)'1' : (char)'0';

A 回答 (5件)

> 以下のようにsprintfで書式し代入した際に最後は0(ヌル文字)をセットして


> くれるのでしょうか?4バイト目の文字が何か知りたいです。

こんなコードで確認されてみてはいかがですか?

for (i = 0; i < 100; i++)
printf ("%x", temp[i]);
printf ("\n");

5バイト目が '\0' になっていることを確認できるでしょう。

> 話は変わりますが、以下のようにするとエラーになりましたが、
> 特定の位置の値をセットする方法はどのようなものがあるのでしょうか?
>
> temp[10] = (temp[10] == '0') ? (char)'1' : (char)'0';

配列の要素数が10個であればアクセスできるのは temp[0] から temp[9] までです。なので temp[10] にアクセスすると Segmentation Fault が発生するかもしれません。
    • good
    • 0

http://www.linux.or.jp/JM/html/LDP_man-pages/man …
>返り値
>成功時には、上記の関数は書き込まれた文字数を返す (文字列の最後を示すために使用する '\0' は数に含まれない)。

「文字列の最後を示すために使用する '\0' は数に含まれない」とわざわざ書いてあると言う事は「文字列の最後を示す '\0' も書き込まれるけど、それは返り値に含めない」と言っている訳で、つまり「文字列の最後を示す '\0' も書き込まれる」と言う事が判る。

>話は変わりますが、以下のようにするとエラーになりましたが、
意味不明。

>temp[10] = (temp[10] == '0') ? (char)'1' : (char)'0';
だけではエラーにならない。

「表示されているエラーメッセージ」を明記せずに、的確な回答を得られると思うのが間違い。
    • good
    • 0

仕様が知りたければ JIS を参照すればいいのに.


C 言語は X3010 という番号で規格化されているので, 規格番号のところに X3010 を入力すれば JIS C の規格が参照できます. 参照だけですが.

参考URL:http://www.jisc.go.jp/app/JPS/JPSO0020.html
    • good
    • 0

>char temp[100];時では0で初期化されていることは保障されていませんが、大抵は0で埋まっていますが、sprintfの仕様が知りたいです。


tempの配列を宣言する行為とsprintfには何の関係もありません。

Cでは自動変数を宣言した場合、0クリアしなくてもいい事になっていたはずですが、0が入っているのであればコンパイラがそういうコードを埋め込んでいるんでしょうね。
そういうことをすると遅くなるのでデバッグオプションをつけてコンパイルしているんじゃないでしょうか。
ただし、静的な変数(グローバル変数やstaticが付いたローカル変数)ならオプションに関わらず0クリアします。

>temp[10] = (temp[10] == '0') ? (char)'1' : (char)'0';
一見問題なさそうなコードですね。
どういうエラーが出ましたか?
    • good
    • 0

>sprintfの仕様が知りたいです。



man sprintf を読んで、わからない点をもう一度質問して下さい。


>話は変わりますが、以下のようにするとエラーになりましたが、

どんなエラーが出たのか補足にどうぞ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!