- ベストアンサー
scanf関数について
scanfで数字を入力し「CTRL+D」で入力終了となるプログラムを考えています. 調べてみると以下の様なプログラムでは入力終了となります. #include <stdio.h> int main(void) { int a[256]; int i = 0; while(1) { printf("Input%d = ", i); if ( scanf("%d", &a[i]) == EOF || i > 255) { break; } i++; } return 0; } しかし,次の様にすると「CTRL+D」では終了しません. #include <stdio.h> int main(void) { int a[256]; int i = 0; while(1) { printf("Input%d = ", i); scanf("%d", &a[i]); <-----追加 if ( a[i] == EOF || i > 255) { <-----変更 break; } i++; } return 0; } この場合は,環境がUNIXのため「-1」と入力すると終了します. 2種類の違いが分かりません. 教えてもらえないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
scanf()関数の戻り値は読み込めたフィールドの数を戻します。 失敗した場合はEOFの戻り値となります。 変更前のソースでは > if ( scanf("%d", &a[i]) == EOF || i > 255) scanf()からの戻り値をEOFと比べています。 他方は > scanf("%d", &a[i]); <-----追加 > if ( a[i] == EOF || i > 255) { <-----変更 scanf()の戻り値をチェックしていません。 &a[i]でも関数から情報を読み出し側に返すことが可能ですが、 これは戻り値とは全く別のものです。 例えば int n; int m; n = scanf("%d", &m); とあり、標準入力から"2"を入力した場合 m, nの値はどうなるでしょうか? mもnもともに2となる? いいえ、違います。 mには標準入力から受け取った2が格納されます。 n は1個のフィールドを変換出来たので1が戻されます。 「戻り値」と「アドレス渡しによるデータ受け取り」 の違いについて、しっかり理解して下さいね。
その他の回答 (2)
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
質問のプログラムは while(1) を while(i<256)として↓のようにも書くことができます。 ここで、if文を見れば、case 1 では scanf() の返り値が EOF のとき break し、case 2 では a[i] が EOF のとき break することによって while() ループから脱出する内容となっています。 case 1 での ctrl+D は EOF 、case 2 での EOF は -1 と考えると良いでしょう。 質問は、while(1) の無限ループにしたことによる思考混乱ではないでしょうか? /* Case 1 */ #include <stdio.h> int main(void) { int a[256], i = 0; while(i < 256) { printf("Input%d = ", i); if (scanf("%d", &a[i]) == EOF) break; //←何故 break? i++; } return 0; } /* Case 2 */ #include <stdio.h> int main(void) { int a[256], i = 0; printf("< EOF= %d >\n", EOF); while(i < 256) { printf("Input%d = ", i); scanf("%d", &a[i]); if (a[i] == EOF) break; //←何故 break? i++; } return 0; }
お礼
scanf関数の戻り値を理解していませんでした.
- anicicle
- ベストアンサー率36% (129/356)
>if ( scanf("%d", &a[i]) == EOF || i > 255) { の「scanf("%d", &a[i]) == EOF 」はa[i]の内容を「比較していない」ことについては理解されてされていますか? あくまでも「scanf()の実行結果(戻り値)」と「EOF」を比較しています。 >scanf("%d", &a[i]); <-----追加 >if ( a[i] == EOF || i > 255) { <-----変更 は「scanf()で取得したa[i]」との比較です。
お礼
scanf関数の戻り値を理解していませんでした.
お礼
scanf関数の戻り値を理解していませんでした.