質問

バッファーがありますが、(バッファーのオーバーランを避けるために) バッファーが保持できる以上の文字をユーザーに入力させたくないのです。

使っています 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];

、あなたは罰金になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top