• ベストアンサー

scanf関数のループについて

ソースコード---------------------------- #include<stdio.h> int main(){ char c; while(scanf("%c", &c) != 1){;} return(0); } -------------------------------------- 入力された文字数が1文字でない間入力待ちになるようなプログラムを意図しているのですが、 例えばaと打ってもaaと打ってもプログラムが終了してしまいます。 意図したようにプログラムが動作するにはどのように書き換えればよいのでしょうか。

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

  • ベストアンサー
  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.1

%cを使うと、連続してscanf関数を使った時にバッファにデータが残っているのでおかしなことになります。 %sを使って文字列の配列に読み込み、strlen関数を使って長さを計算するのが良いと思います。 答えはズバリ書きませんので試行錯誤してみてください。

Kdesky
質問者

お礼

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

その他の回答 (2)

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

厳密には EOF を意味する入力 でもループしちゃいますね>#2. ちなみに EOF が -1 とは限らない.

Kdesky
質問者

お礼

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

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.2

scanf("%c", &c)は文字の取り込みが成功したら真(1)、 失敗したら偽(0)終わりになったらEOF(-1)を返します。 したがって、scanf("%c", &c) != 1というのは文字の取り込みが失敗する間繰り返す。 =文字の取り込みが成功したら終了します。 よって、何を入れてもループは抜けてしまいます。

関連するQ&A

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

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

  • 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関数について

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

  • scanf文がうまくいかないのですが・・・

    下のようなプログラムを実行するとうまくいかないのですが、何故なのでしょう。 どうかお教えください。 #include<stdio.h> int main(void) { int i; char n; for(i = 0; i < 10; i++) { printf("nを入力してください>>>"); scanf("%c",&n); printf("%c\n",n); } return 0; }

  • doループ内での scanf

    Visual C++ win32 console application でC言語の勉強をしています 制御文に入ったところで、scanf文が無視され、プログラムが進んでいく という事態に直面して困っています。 どなたか下記のプログラムの間違いを指摘してください あるいは  言語仕様についてご教示ください 以下、まるまるコピーします #include<stdio.h> int main(void) { int g; char ch; do{ printf("何ガロンですか?: "); scanf("%d", &g); printf("%.2fリットルです\n", (3.7854)*g); printf("また計算しますか?Y/N : "); scanf("%c", &ch); printf("%c\n", ch); }while(ch == 'Y'); return 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の後のfgetsについて

    #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); /*入力できない*/ return 0; } この例文だと、fgets関数が改行コードを読み取って、終了してしまい文字列入力が出来ないみたいなんですが、scanfの後にfgetsを使うような(scanfとfgetsの間にscanfの残した?改行コードを取り除く方法)処理はどのような方法があるのでしょうか? 試しにfgets文を2度書いたら思っていた動作をしてくれたのですが、はたしてfgets文を2度書くというような事をしていいものなのでしょうか?見た目もなんだか変な感じですし。。↓ #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); fgets(name,10,stdin);  /*入力できる*/ return 0; }

  • ループのとめ方

    入力した文字を小文字から大文字に 変えるプログラムで、コントロール+z で、ループを抜け出すようにしたい。 連続して2度コントロール+zを 押さないととまらないのですが、 どのようにすれば、1度コントロール+zを 押すだけで、終了できるのでしょうか? 何かアドバイスをお願いします。 ======================================== #include <stdio.h> #include <ctype.h> #include <string.h> int main(void) { char moji[50],check=0; int i,len; while(check !=EOF){  printf("Enter : ");  check = scanf("%s",moji);  len=strlen(moji);  if(check!=EOF){   printf("Display : ");   for(i=0;i<len;i++){     printf("%c",toupper(moji[i]));   } } } return 0;

  • scanf関数 バッファに残ったエンター入力の扱い

    前日質問にて以下のプログラムで、二度目のscanf()が無視されてしまう 旨質問したところ、1度目のscanfでの入力でエンターがバッファに残って いるため、それを取り込んでしまうという回答いただきました。 改善方法として(*)のscanf関数で「%c」の前に空白を入れたところ 正常に動作し、改善されたのですが、なぜ改善されたのかご教示願えませんでしょうか? よろしくお願いします #include <stdio.h> int main(void) {   int g;   char ch;      do {     printf("何ガロンですか?: ");     scanf("%d", &g);     printf("%.2fリットルです\n", 3.7854 * g);     printf("また計算しますか?Y/N : "); (*) scanf("%c", &ch);   } while(ch == 'Y' || ch == 'y');   return 0; }

  • 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の値がエラーになってしまいます どこがおかしいのが ご教授して頂けたら幸いです。