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種類の違いが分かりません.
教えてもらえないでしょうか?
No.2ベストアンサー
- 回答日時:
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が戻されます。
「戻り値」と「アドレス渡しによるデータ受け取り」
の違いについて、しっかり理解して下さいね。
No.3
- 回答日時:
質問のプログラムは 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;
}
No.1
- 回答日時:
>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]」との比較です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムの実行時に'<'でリダ...
-
正負を反転させて出力するプロ...
-
漢字のソートについて
-
*をユーザーが入力した数字の数...
-
C言語について
-
Userformの入力順序をタブオー...
-
コマンドプロンプトからのEOFの...
-
Yesならこっちへ、NOなら...
-
Excel VBAで、Application.Inpu...
-
プログラミング初心者です。 Py...
-
C言語(構造体)
-
cygwin上でのプログラミングに...
-
IF文で戻ることはできますか?...
-
getchar()について 教えてくだ...
-
4桁の数字以外を入力したらエラ...
-
C言語について質問です。 以下...
-
scanf()で、エラー対応
-
"scanf"でエンターで改行させな...
-
Javaの質問です
-
恥ずかしながらC言語解析中のプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
プログラミングの問題です 「金...
-
Eclipseコンソール表示を、リセ...
-
C言語 逆ピラミッドの作り方
-
"scanf"でエンターで改行させな...
-
scanf が無視されます
-
if文の条件にscanf関数を使うと…?
-
C言語について
-
C言語scanf_sで何故か2回入力に...
-
Excel VBAで、Application.Inpu...
-
小数か整数かを判定する方法
-
cout関数を使っているのですが...
-
double型が正常に認識されてい...
-
scanfが2回使えない・・・?;
-
C言語でgetchar();が上手く使え...
-
WindowsでEOF
おすすめ情報