1

ファイル名を表す一連の文字列を作成するために sprintf を使用しようとしています。ファイルの名前は 1、2、3、4、5、... となりますが、これを行うと奇妙なエラーが発生します。for ループは、最初のラウンドのみを出力します。出力は次のとおりです。 str: 1.xlxs i: 7567468

char str[3];
int i;

for(i = 0; i < FILES; i++){
    sprintf(str, "%d%s", i+1, ".xlxs");
printf("str: %s\n", str);
    printf("i: %i\n", i);
}
4

5 に答える 5

5

str[3]バッファが小さすぎてデータを保持できません ( ) "1.xlxs"。少なくともstr[7]文字列とヌルバイトを保持する必要があります。

バッファが小さすぎると、バッファ オーバーフローが発生します。

http://en.wikipedia.org/wiki/Stack_buffer_overflow

于 2013-03-22T07:19:26.927 に答える
1

この変更を行うと、準備完了です。

#define FILES 3   

char str[FILES][7];
int i;

for(i = 0; i < FILES; i++)
{
    sprintf(str[i], "%d%s", i+1, ".xlxs");
    printf("str: %s\n", str[i]);
    printf("i: %i\n", i);
}
于 2013-03-22T07:22:30.710 に答える
1

で予約したスペースが少なすぎますstriには 1 文字、拡張子には 5文字".xlxs"、末尾の にはさらに別の文字が必要な\0ので、次のように宣言しstrます。

char str[7];

あなたの文字列に収まるように。printfバッファが小さすぎる\0と、\0.

于 2013-03-22T07:21:01.830 に答える
0

strバッファーの長さはわずか 3 文字ですが、入れようとしている文字列ははるかに大きくなります。このインスタンスでは、何も悪いことが起こらずに配列の終わりをたまたま書き留めることができるため、これは機能します。

于 2013-03-22T07:21:19.303 に答える
0

あなたの場合、これを使用する方が安全です:

snprintf(str, sizeof(str), "%d%s", i+1, ".xlxs");

これにより、文字配列の制限を超えないようにすることができます。

具体的には、少なくともchar[7]を保持する必要があります"1.xlxs\0"

于 2013-03-22T07:29:28.333 に答える