scanf をバグらないように使う | vicのブログ

vicのブログ

ツール系やソフト開発について書こうと思っています。
書き込み大歓迎です。
間違いとかもっといい方法とかあったらご指摘いただけるとありがたいです。
質問をいただいたら、記事をもっとわかりやすく変更します。

scanf は、入力バッファが残るバグ(仕様)がある。

で、使用方法に注意が必要。

●簡潔なまとめ

%c は使わない。下記例
scanf("%c", &a);

空白文字が途中にあるとバッファに残り、次の入力で続きを勝手に入れられる(This is a pen.  など)

例:
char a[20];
scanf("%s", a);

解決策

scanf("%s[^\n]", a);


バッファオーバーラン

文字数オーバー対策、下記では19文字(19+1(終端))までと指定してある
char a[20];
scanf("%19s%*[^\n]", a);
配列数-1 なので注意、%*[^\n] は19文字を超えたら、超えた分、無意味にする

最も簡単な対処法

以下のコードを入れれば、入力バッファをクリアしてくれるらしい
scanf("%*s");



情報源
https://ja.wikipedia.org/wiki/Scanf#scanf.E3.81.AE.E5.95.8F.E9.A1.8C.E7.82.B9.E3.81.A8.E5.9B.9E.E9.81.BF.E6.96.B9.E6.B3.95