はじめての 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行分の 文字列を 表すことになる。