はじめての C
「対話型入力 2」
これは 動いてくれます。 ただし、ユーザが おかしな整数値を入力しなければ、ですが。
scanf の 呼び出し - call - を 改良する 1つの 手段として、返り値のチェックが あります。
scanf は 値によって 数値を 返します。 呼び出しが 成功すれば 1 を 返すので、その値を 組み込むように するのです。
int var;
if (scanf("%d", &var) != 1) {
fputs("Error, invalid integer");
exit ( EXIT_FAILURE );
}これは 簡単だし 処理も 十分ですが、ただ その症状を 改善しただけで、実際の問題が 解決されたわけでは ありません。
というのも、ユーザからの 入力で scanf が 不適当な 使われ方をする、という 事実は 残っているのですから。
さらに 悪いことに、プログラマというのは scanf で 文字列データも 読み込もうと するのです。
char buf[20];
scanf("%s", buf);
or
scanf("%[^\n] ", buf);scanf は、最初の例では 空白が 見つかるまで 文字数を 読み込み、二つ目の例だと、新しい行の 文字が 来るまで 文字数を 読み込みます。
ここでの問題は、その文字数が どのくらいの 範囲に 収まるのか、ということです。
入力数が 20 を 越えてしまうと、いったい なにが 起きるのでしょう ?
結果は はっきりしません。 ただ 通常では、あなた自身の ものでもない メモリが 踏みにじられて、プログラムが 動かなくなり burn するか、あるいは そのまま 稼働しても 大変な 損傷を 受けるか、でしょう。
これには、どれだけの文字数を 読み込むかを 指定するという 手続きをすれば、その場しのぎ ですけど、解決が 可能に なります。
(コードは 省略)
(注) %[^\n] - 改行文字以外の すべての文字(列)と マッチする。結果的に 1行分の 文字列を 表すことになる。