質問
バッファーがありますが、(バッファーのオーバーランを避けるために) バッファーが保持できる以上の文字をユーザーに入力させたくないのです。
使っています scanf
そして次のようにしました:
char buffer[30] = {'\0'};
scanf("%30s", buffer);
ただし、ユーザーが 30 を超えて入力した場合は保護されることはわかっています。ただし、ユーザーが 30 を超える値を入力した場合、バッファは null で終了しますか?
解決
scanf()
"%s" 変換指定子を使用すると、終端の null 文字がバッファに追加されます。
しかし, 、30 文字を要求していますが、実際には 31 文字で、30 文字分のスペースしかないことを意味します。最大フィールド幅 29 を使用する必要があります。
char buffer[30] = {'\0'};
scanf("%29s", buffer);
変換指定子にも注意してください。 "%c"
ほぼ同じように動作します "%s"
, ただし、終端の null 文字は追加されず、入力からスペースは破棄されません。何を期待するかによっては、「%s」を使用するよりも良い場合があります。
char buffer[30] = {'\0'};
scanf("%29c", buffer);
buffer[29] = '\0';
他のヒント
scanf
マニュアルから:
のSののシーケンスにマッチします 非空白文字。次 ポインタ charへのポインタでなければならず、アレイに十分に大きくなければなりません すべてのシーケンスと終端のヌル文字を受け入れます。ザ・ 入力文字列が空白で、または最大フィールド幅で停止し、 どちらが最初に発生します。
あなたは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);
彼が持っている場合は、また、ユーザーが入力した場合の復帰/改行をチェックして、scanf
を終了する必要があります:
scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);
と、それはそう、戻り値をチェックすることをお勧めします:
int rc = scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);
そして最後に、そこに残さ何だ(例えば改行などは、それを消費する)かどうかを確認します:
if (!feof(stdin))
getchar();
あなたは、バッファオーバーランを持つことになります。このようなあなたのバッファを宣言します:
char buffer[31];
、あなたは罰金になります。