こんにちは、以下に示すように、文字配列の3文字を出力する簡単なコードがあります
void main()
{
char str[]={65,66,67};
printf("%.3s",str);
}
これにより出力ABC
が得られますが、これは文字列ではないため、ヌルで終了していないことを意味するので、どうすれば%s
それを処理して正しい結果を得ることができるのでしょうか?
文字列の長さを渡したので、printf では 0 ターミネータは必要ありません。
7.21.6.1 - 8
精度が指定されている場合、そのバイト数を超えて書き込まれることはありません。精度が指定されていないか、配列のサイズより大きい場合、配列にはヌル文字が含まれます。
精度修飾子を指定したため、機能します。%.3s は文字通り、入力から最初の 3 バイトを出力することを意味します。修飾子 ("%.3s" -> "%s") を削除しても、このコードはエラーなしでビルドされますが、実行時の結果は予測できません (そしてエクスプロイトを歓迎します)。
@khachikスニペットが期待どおりに実行されるとは思いません。どちらのGCC4.2を使用してもOSXで結果を再現できません。4.7またはClang3.1
上記の回答を明確にするために (@cnicutar および dans3itz による): 次のコードは "ABCDE" を出力します。つまりprintf
、配列を最初の null 文字 (0 バイト) までスキャンします。
#include <stdio.h>
int main() {
char str[]={65,66,67};
char c = 68;
int x = 69;
int y = 70;
int z = 0;
int w = 71;
printf("%s", str);
return 0;
}
F
( int w = 71;
) は印刷されません。