• ベストアンサー

scnafの戻り値を使って処理を中止したい。

何も標準入力より入力しなかったとき、scanfの戻り値は-1なので、-1じゃないとき処理継続にしても 期待どおりの結果が得られませんでした。どうしたらよいでしょうか? #include <stdio.h> int main(void){ int i; int seisu[10]; i = 0; while (i < 10 && -1 != scanf("%d", &seisu[i])) { i++; } }

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

  • ベストアンサー
回答No.2

> 何も標準入力より入力しなかったとき、scanfの戻り値は-1なので この認識が間違いなんじゃないかな? scanfがEOFを返すのは、変換以前に問題があった場合で、標準入力がリダイレクトされていて、リダイレクトされたファイルがすでに終端まで達しているといった場合なんじゃないかと思う。 ENTERキーだけで進んだ場合は、変換失敗で0が返ってくるのでは?

hunt9999
質問者

お礼

ありがとうございました。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

数字でも空白でも無い文字を入力してしまった場合 ・"%d"で変換できないので、戻り値「変換できた個数」は0 ・ファイルポインタは、読み込めなかった位置から移動しないので、何の対策もなく次にscanfしても、戻り値0 となり、EOFになりません。(-1とか直接書かない方がいいです) 正常に読めたかどうかは、%~の数と一致するかどうかで調べる方が確実です。 #2さん scanf系では、改行は空白扱いです。 Enterを押し続けたら、ひたすら読み飛ばし続けて返ってこないだけです。

hunt9999
質問者

お礼

thanks for your sincere answer!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「1 だったら続ける」って書かないのはなぜ?

hunt9999
質問者

お礼

どうも!

関連するQ&A

  • 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になっているのかわかりません。 入力バッファに何か残ってしまっているということなのでしょうか? 以上教えていただけると嬉しいです。

  • do while 文の使い方

    #include<stdio.h> main() { int i; do{ scanf("%d",&i); }while(i%6==1,2,3,4,5); } だと6の倍数打っても終わらないのですが、 include<stdio.h> main() { int i; do{ scanf("%d",&i); }while(i%6!=0); } } だと6の倍数を入力すれば終了します。 やはり、「1,2,3,4,5」という表現ではだめなのでしょうか? 

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

  • 戻り値について

    プログラミング初心者です。 よろしくお願いします。 C++を使っています。 早速なのですが、以下にプログラムを記載します。 ◎1---------------------------------------- #include<stdio.h> main() { char ss[256]; gets(ss); puts(ss); } ---------------------------------------- ◎1を実行すると、「型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません」と表示されます。 参考書には、「戻り値のvoidがないと勝手に戻り値の関数をint型と解釈する。関数の宣言と定義が合わないとコンパイル時にエラーとなる」とあったのですが、 ◎2------------------------------------- #include<stdio.h> int main() { char ss[256]; gets(ss); puts(ss); } ------------------------------------- 以上の◎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回目と判定を入れなければならないか教えて下さい。

  • printf()で出力したいんですが?

    #include <stdio.h> int main( void ) { int air[4]; int i; i = 0; printf( "データ入力\n" ); do{ scanf( "%d\t", &air[ i++ ]); } while(air[ i - 1 ] > 0 ); printf( "%d\n", i ); return 0; } このプログラムはコンパイル出来ますが、期待していたprintf関数での出力ができません。 その理由として何がありますか?関数の使い方が間違っているのか、DO~WHILE文が使えない場所 なのか、もし直すとすればどう直せばいいのですか。

  • なぜかわかりません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); }

  • わかりません・・・。

    100個以下の整数を読み込んで、読み込んだ整数の一覧,それらのうちの最大値と二番目に大きい値とを表示するプログラムをつくりたいのですが、わかりません。 教えてください!! 実行例 整数は何個ですか:5 1 個目:65 2 個目:30 3 個目:98 4 個目:10 5 個目:54 入力された整数は 5 個で, 65 30 98 10 54 です. 最大値は 98 です. 二番目に大きい値は 65 です. ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー #include<stdio.h> #define number 100 int main (void) { int i; int seisu[number]; int max; puts("整数を入力してください。"); for(i=0, i<number, i++){ printf("%2d番",i+1); scanf("%d",&seisu[i]); } max=seisu[0] for(i=1, i<number, i++){ if (seisu[i]>max) max=seisu[i]; } printf("最高点:%d\n",max); return(0); } までしかわかりません。 2番目に大きい値と‘整数は何個ですか: ‘と‘入力された整数は 個で です。‘の部分はどうすればいいのでしょうか??

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

専門家に質問してみよう