2

こんにちは、以下に示すように、文字配列の3文字を出力する簡単なコードがあります

void main()
{
    char str[]={65,66,67};
    printf("%.3s",str);
}

これにより出力ABCが得られますが、これは文字列ではないため、ヌルで終了していないことを意味するので、どうすれば%sそれを処理して正しい結果を得ることができるのでしょうか?

4

4 に答える 4

10

文字列の長さを渡したので、printf では 0 ターミネータは必要ありません。

7.21.6.1 - 8

精度が指定されている場合、そのバイト数を超えて書き込まれることはありません。精度が指定されていないか、配列のサイズより大きい場合、配列にはヌル文字が含まれます。

于 2012-08-08T16:12:09.593 に答える
2

精度修飾子を指定したため、機能します。%.3s は文字通り、入力から最初の 3 バイトを出力することを意味します。修飾子 ("%.3s" -> "%s") を削除しても、このコードはエラーなしでビルドされますが、実行時の結果は予測できません (そしてエクスプロイトを歓迎します)。

于 2012-08-08T16:21:48.557 に答える
0

@khachikスニペットが期待どおりに実行されるとは思いません。どちらのGCC4.2を使用してもOSXで結果を再現できません。4.7またはClang3.1

于 2012-08-08T16:46:10.750 に答える
0

上記の回答を明確にするために (@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;) は印刷されません。

于 2012-08-08T16:25:11.690 に答える