scanf
は 2 つの異なる方法で情報を返します: 変数内i
で、およびその戻り値として。i
数値scanf
を返すことができる場合、変数の内容は読み取る数値です。からの戻り値はscanf
、数値を読み取ることができたかどうかを示します。
テストは基本的に型エラーです。エラー インジケーターの値を、浮動小数点数を保持するように設計された変数i != EOF
と比較しています。EOF
これは誤って有効な C コードであるため、コンパイラは文句を言いません。EOF
整数値としてエンコードされ、その値は比較を実行するために浮動小数点値に変換されます。-1
実際、プロンプトで入力すると、ループが終了することに気付くでしょう。-1
定数の値ですEOF
(ほとんどの実装で)。
の戻り値をscanf
格納し、それを別の変数に格納する必要があります。戻り値がEOF
の場合、ループを終了します。戻り値が 1 の場合、浮動小数点値が正常に読み取られています。
戻り値が 0 の場合、ユーザーは解析できないものを入力しました。このケースを適切に処理する必要があります。何もしないと、ユーザーの入力は破棄されず、プログラムは永久にループします。意味のある 2 つの選択肢は、1 文字を破棄するか、行全体を破棄することです (後者を行います)。
double i;
double array[42];
int x = 0;
int r = 0;
while (r != EOF) {
printf("type in a number: \n");
r = scanf("%f", &i);
if (r == 1) {
/* Read a number successfully */
array[x] = i;
x++;
} else if (r == 0) {
printf("Invalid number, try again.\n");
scanf("%*[^\n]"); /* Discard all characters until the next newline */
}
}
x
また、配列の境界をオーバーフローしていないことも確認する必要があります。これは練習問題として残しておきます。