アプリ版:「スタンプのみでお礼する」機能のリリースについて

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種類の違いが分かりません.
教えてもらえないでしょうか?

A 回答 (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が戻されます。

「戻り値」と「アドレス渡しによるデータ受け取り」
の違いについて、しっかり理解して下さいね。
    • good
    • 0
この回答へのお礼

scanf関数の戻り値を理解していませんでした.

お礼日時:2010/04/08 10:59

 質問のプログラムは 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;
}
    • good
    • 0
この回答へのお礼

scanf関数の戻り値を理解していませんでした.

お礼日時:2010/04/08 11:00

>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]」との比較です。
    • good
    • 0
この回答へのお礼

scanf関数の戻り値を理解していませんでした.

お礼日時:2010/04/08 10:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!