バッファがあり、バッファが保持できるよりも多くの文字をユーザーに入力させたくありません(バッファオーバーランを回避するため)。
私はscanf
このように使用しており、次のようにしています。
char buffer[30] = {'\0'};
scanf("%30s", buffer);
ただし、ユーザーが30を超えて入力した場合、保護されていることはわかっています。ただし、ユーザーが30を超えて入力した場合、バッファーはnullで終了しますか?
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();
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';
終了するNUL文字を許可していないため、バッファオーバーランが発生します。次のようにバッファを宣言します。
char buffer[31];
そしてあなたは元気になります。