• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答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が戻されます。 「戻り値」と「アドレス渡しによるデータ受け取り」 の違いについて、しっかり理解して下さいね。

tokkotokon
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答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; }

tokkotokon
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • anicicle
  • ベストアンサー率36% (129/356)
回答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]」との比較です。

tokkotokon
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • scanf()関数の使い方について

    はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • scanf が無視されます

    例えば下のようなプログラムを実行するとmain関数の scanf が無視 されてしまいますが何故なのでしょうか。コンパイラはLSI C-86試食版です。 ----------------------------- #include <stdio.h> int main ( ) ; void aa ( ) ; int main ( ) { int i ; aa ( ) ; printf ( " input i. \n " ) ; scanf ( " %d ", &i ) ; printf ( " i = %d\n ", i ) ; } void aa ( ) { int x, y ; while ( scanf ( " %d ", &x ) ! = EOF ) { y = x ; printf ( " y= %d\n ", y ) ; } } --------------------------------

  • scanfについて

    いつもお世話になっております ------------------------ #include<stdio.h> #include<stdlib.h> int main(void){ int age , kyoku; char buff[16]; while(age){ printf("0で終了/年齢を入力して下さい"); scanf("%d",buff); age = atoi(buff); if( age == 0 ){ printf("終了します\n"); break; } ・ ・ ・ ------------------------ 上記のプログラムは、 年齢を入力させて もしも0だったら処理を終了させるという プログラムです。(つもり) scanfで入力された値を いったんバッファに蓄えて atoiで整数に変換させているつもりなんですが 例えば、「20」と入力しても ageの値が0、buffの値がエラーになってしまいます どこがおかしいのが ご教授して頂けたら幸いです。

  • 素数判定の繰返し

    繰返し素数判定を行ない、CtrlーDで終了するプログラムをつくっています。 まず繰返しなしの素数判定プログラムを作り #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } return(0); } これはちゃんとできたのですがそれを繰り返すことができません。 #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); while((a=getchar())!=EOF){ if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } printf("自然数を入力:"); scanf("%d",&a); } printf("プログラムを終了します。\n"); return(0); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

  • なぜかわかりませんscanf()の戻り値で迷ってます。

    ある本にscanf()の書き方が書いてあってそれを入力してもエラーが表示されてわかりませ。 使用ソフトはMicrosoft Visual c++です。どこが間違っているのか教えてください。 #include <stdio.h> #include <stdlib.h> int main (void) { int score[10]; int status; int temp_score; int score_count; int i; /*配列に位に入力*/ score_count = 0; while(1){ status=scanf("d",&score_count); if (status == EOF ){ break; }else if (status != 1){ fprintf(stderr ,"入力エラー\n"); exit(1); } if (score_count >= 10 ){ fprintf( stderr,"データ件数が多すぎます\n"); exit(1); } score[score_count] =temp_score; score_count++; } } /*配置の内容を表示する*/ for(i=0 ;i < score_count;i++){ printf("score[%d]..%d\n",i,score[i]); } return (0); }

  • scanf関数の戻り値について

    --------------------------------------- #include<stdio.h> int main(void) { int dt; while(scanf("%d",&dt)==1){ if(dt==0){ printf("0は入力しないでください\n"); puts(""); } else if(dt<0){ dt=-dt; printf("入力値の絶対値は「%d」です\n",dt); puts(""); } else{ printf("入力値の絶対値は「%d」です\n",dt); puts(""); } } return 0; } --------------------------------------- 以上のプログラムについて疑問があります。 scanf関数の戻り値が1の間、繰り返すというもので、入力の時に整数入力ですが、あえて実数である1.1を入れたとします。 scanfの戻り値は1で、dtには整数部の1だけ設定されていたので、これでもうまくいくのかと思ったのですが、次の入力はscanfの戻り値が0になっていて出来ませんでした。 何故0になっているのかわかりません。 入力バッファに何か残ってしまっているということなのでしょうか? 以上教えていただけると嬉しいです。

  • switch文とscanfについて

    ソースコード------------------------------------- #include <stdio.h> void main(){ int i; char s, ch; while(1){ printf("Input 1 or 2\n"); scanf("%c", &s); switch(s){ case '1' : printf("Input a number\n"); scanf("%d", &i); printf("You input '%d'\n", i); break; case '2' : printf("Input a character\n"); scanf("%c", &ch); printf("You input '%c'\n", ch); break; } } } ----------------------------------------------- 実行例----------------------------------------- Input 1 or 2 1 Input a number 4 You input '4' Input 1 or 2 Input 1 or 2 //------(1) 2 Input a character You input ' //------(2) ' Input 1 or 2 ----------------------------------------------- (1)について。 なぜ"Input 1 or 2"が二回繰り返されているのですか。 (2)について。 scanfが呼び出されて入力待ちになることを期待しているのですが、 なぜ(2)のようになってしまうのでしょうか。

  • 数値の連続入力終了条件について

    C言語初心者です。よろしくお願いします。 早速質問なのですが、while文を使ったscanf()関数による数値連続入力で、 ◎1---------------------------------------------- #include<stdio.h> int main(void) {      double dt,sum=0.0;      while(scanf("%lf",&dt) !=EOF){   sum=sum+dt; }   printf("合計=%f\n",sum); return 0; } ---------------------------------------------- ◎1のようにすれば、Ctrl+ZでEOFが返されたら終了とわかるのですが、今度は「0」が入力されたら処理を終了するというプログラムで、 ◎2---------------------------------------------- #include<stdio.h> int main(void) {      double dt,sum=0.0;      while(scanf("%lf",&dt) !=0.0){   sum=sum+dt; }   printf("合計=%f\n",sum); return 0; } ---------------------------------------------- ◎2のようにすると「0」が入力されても、終了せず、以下に示す◎3のように、しないと終了出来ません。 ◎3---------------------------------------------- #include<stdio.h> int main(void) {      double dt,sum=0.0;          scanf("%lf",&dt);      while(dt!=0.0){   sum=sum+dt; scanf("%lf",&dt); }   printf("合計=%f\n",sum); return 0; } ---------------------------------------------- ◎2で何故、◎1のように出来ず、◎3のようなscanf()を1回目、2回目と判定を入れなければならないか教えて下さい。

  • for文内でscanf関数により配列に数値を格納することについて

    プログラミング初心者です。 よろしくお願いします。 ◎1------------------------------------ #include<stdio.h> int main(void) { int i,dt[3]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[3]=%d\n",dt[3]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("dt[3]=%d\n",dt[3]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- ◎2------------------------------------ #include<stdio.h> int main(void) { int i,dt[2]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- 以上2つのプログラムについて疑問があります。 まず◎1については、あえて添え字のdt[3]の値を見てみようと思ったら、iの値が入っているとわかりました。 しかし、何故添え字の番号の配列にiの値が入っているのかがわかりません。 次に◎2ですが、3回目のループで、添え字の番号の配列自身に入力した数値を格納すると、iと添え字番号配列に入力した数値が入っていました。 何故このようになっているのか疑問です。 以上のような疑問があります。 添え字の番号の配列とiが何か関連があるようですがいまいちわかりません。 教えていただけると嬉しいです。

  • scanf関数のループについて

    ソースコード---------------------------- #include<stdio.h> int main(){ int i; while(scanf("%d", &i) != 1){;} return(0); } -------------------------------------- 1が入力されるまで入力待ちになるようなプログラムを意図してるのですが、 このプログラムでは二回目以降の入力ができなくなってしまいます。 なぜでしょうか。 意図したようにプログラムが動作するにはどのように書き換えればよいのでしょうか。

このQ&Aのポイント
  • DCP-J1200Nのプリンターを使っていますが、印刷するといつも白紙になってしまいます。
  • 印刷頻度が少ないため、冬の寒い時期にはインクが出にくいのかもしれません。
  • ただし、故障の可能性も考えられます。
回答を見る

専門家に質問してみよう