2

バッファがあり、バッファが保持できるよりも多くの文字をユーザーに入力させたくありません(バッファオーバーランを回避するため)。

私はscanfこのように使用しており、次のようにしています。

char buffer[30] = {'\0'};
scanf("%30s", buffer);

ただし、ユーザーが30を超えて入力した場合、保護されていることはわかっています。ただし、ユーザーが30を超えて入力した場合、バッファーはnullで終了しますか?

4

3 に答える 3

2

scanfマニュアルから:

空白以外の文字のシーケンスに一致します。次のポインタはcharへのポインタである必要があり、配列はすべてのシーケンスと終了NUL文字を受け入れるのに十分な大きさである必要があります。入力文字列は、空白または最大フィールド幅のいずれか早い方で停止します。

UBを呼び出しています。試す:

#define str(x) #x
#define xstr(s) str(x)
#define BUFSIZE 30

char buffer[ BUFSIZE + 1 ];
scanf("%" xstr(BUFSIZE) "s", buf);

文字以外のものを無視するにBUFSIZEは、割り当てを抑制します。

scanf("%" xstr(BUFSIZE) "s%*", buf);

また、ユーザーがreturn / newlineを入力したかどうかを確認し、次の場合は終了scanfする必要があります。

scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);

また、戻り値を確認することをお勧めします。

int rc = scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);

そして最後に、何かが残っているかどうかを確認します(改行など、それを消費します)。

if (!feof(stdin))
    getchar();
于 2009-11-12T09:48:28.843 に答える
2

scanf()「%s」変換指定子を使用すると、終了ヌル文字がバッファーに追加されます。

ただし、30文字を要求しています。これは、実際には31を意味し、30のスペースしかありません。最大フィールド幅は29を使用する必要があります。

char buffer[30] = {'\0'};
scanf("%29s", buffer);

また、変換指定子"%c"はとほとんど同じよう"%s"に機能しますが、終了ヌル文字を追加せず、入力からスペースを破棄しないことにも注意してください。期待する内容によっては、「%s」を使用するよりも良い場合があります。

char buffer[30] = {'\0'};
scanf("%29c", buffer);
buffer[29] = '\0';
于 2009-11-12T09:59:53.503 に答える
1

終了するNUL文字を許可していないため、バッファオーバーランが発生します。次のようにバッファを宣言します。

char buffer[31];

そしてあなたは元気になります。

于 2009-11-12T09:47:24.193 に答える