• ベストアンサー

whileとscanfの関係について

while文中のscanf関数が意図しない動作をして困っています 簡略化したコードがこちらになります while(1){ // view printf("view\n"); // input char key; scanf("%c", &key); // update printf("update\n"); } 行いたい動作というのは単純で view -> input -> update ->を繰り返したいだけなのですが 上記プログラムでは下記のような動作になってしまいます view -> input -> update -> view -> update -> view -> input -> 偶数回目のループでは、inputが飛ばされてしまうのですが、何が原因なのかかがわかりません。 言語仕様に詳しい方、どなたかご教示ください。 環境 WindowsXP Visual C++ 2008 ExpressEdition

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

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

scanf()を使用していることに対しての弊害ですね。 scanf()はリターンキーの直前までの入力をキーバッファから取得します。 キーバッファにはリターンキーが残ったままとなっている為、次のscanf()でバッファに残ったものが取り込まれてしまう為に発生する問題です。 「printf("update\n");」の部分でブレークをかけて「key」の入力内容を確認すればわかりますが、偶数回目にはリターンキーのコードが取得されています。 scanf("%c", &key); scanf( "%*[^\n]" ); のように、取得した内容以降のバッファの読み飛ばしを追加するか scanf()以外の入力関数でを使用することで回避します。

fumihio
質問者

お礼

詳しい仕様、解決法をありがとうございます 偶数回目では改行コードを読んでしまっていたんですね iostreamを使うのは(何故か)少し抵抗があるのですが、cinを使うことにします。 ありがとうございました。

その他の回答 (2)

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.3

inputの時に「何も文字を入力しないで、Enterキーだけ押す」と、毎回inputします。 これは「毎回scanfで改行を読み込むため、毎回キーバッファが空になるので、毎回キー入力待ちする」からです。 入力の時に1文字じゃなく「abcdefghijk」「Enter」と押せば、偶数回どころの騒ぎじゃなく、改行を含めた11回分inputがスキップされ、キー入力待ちになりません。 「1文字入力してEnterキー」は「Enterを含めて2文字入力している」のですから、scanfが入力済みの2文字分をすべて取り出さないかぎり、キー入力待ちにはなりません。

回答No.1

詳しくないし,検証もしてないけど こんな話を聞いたような。 http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4-2 #なんでこんな仕様になっているんでしょうね

fumihio
質問者

お礼

参考urlありがとうございます、納得しました。

関連するQ&A

  • 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)のようになってしまうのでしょうか。

  • 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が実行されません

    Cについて質問です。 whileループに入る前にscanfでchar変数に文字を代入するようにして、その文字でwhileループの条件を設定したのですが、scanfが実行されずにすっ飛ばされてwhileループに入ってしまいます。 同じようなコードををdo-while文で書いてみたところ、一回目のscanfがやはりすっ飛ばされて二回目に入り、そこでscanfが実行されます。 エラーは出ません。何が間違っているのか、さっぱり分かりません。教えてください。

  • 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が2回使えない・・・?;

    scanfが使えなくて困っています。どなたか教えていただけないでしょうか(>_< 現在scanfが2つあるプログラムを作っています。 scanfのあるプログラムを実行すると入力待ち画面になりますよね。以下のプログラムを実行すると 1回目のscanfは入力待ちになるのですが2回目は入力待ちにならずに 最後まで行ってしまいます・・。 void main(){ int b; char d, names[20]; printf("名前入力\n"); scanf("%s", &names); printf("1文字キー入力\n"); scanf("%c", &d); printf("\n名前は %s : キーは %c です。\n", names, d); } 実行結果 -------------------------------------- 名前入力 dra2jp 1文字キー入力 名前は dra2jp : キーは です。 -------------------------------------- 名前入力のところは入力待ちになるのですがキー入力ができずに一気に最後までいってしまい、 つまり2回入力待ちにならなければならないのに1回の入力でプログラムが終了してしまいます。 どこが間違っているのでしょうか(>_< どなたかご指導お願いします:;

  • 関数の値(scanf)

    初心者なもので、言葉の使い方を間違っていたら申し訳ありません。いいたいことが伝わればよいのですが…。 scanfに関して疑問に思ったことがあります。経験的なことなので、正しいかわからないです。次の(1)と(2)から(3)のことが正しいか教えてください。 (1) int a; do{ printf("整数を入力してください\n"); }while(scanf("%d",&a) ==0); printf("入力した数は、%dです",a) このとき、「(いかなる整数)+(ENTER)」を入力しても、do~whileのループを抜け出す。 (2)また、上のプログラムで、継続条件式の中身を  … }while(scanf("%d",&a)!=0);  … とすると、「(いかなる整数)+(ENTER)」を入力してもループが抜け出せない。 (3)したがって(1)と(2)から、scanf()は入力するだけで、値を真(1)を返す。

  • n^kのwhile文のプログラムについて

    下のプログラムを実行すると無限に計算されるのはなぜですかどこがおかしいか教えてください /* while1.c---for bun* n no jou*/ main() { int n,k,m,i; printf("Input n\n"); scanf("%D",&n"); printf("Input k\n"); scanf("%d",&k"); m=1; while (i<=5) { m=m*n; printf("%d no %d jou =%D\n",n,i,m); i++; } } あとこれをdo while文にするにはどうすればいいんですか

  • c言語のscanfとfgetsについて

    2つの単語A, Bを入力して、AがBに含まれるか否かというプログラムで 以下のようなものを作成しました。 そこで質問なのですがscanf()をfgets()に変えるとうまく動作しません どこが間違ってますか? 変更したいfgets fgets(key, sizeof(key), stdin); fgets(word, sizeof(word), stdin); ------------------------------------------------- int main(void) { char key[101], word[101]; scanf("%s", key); scanf("%*c%s", word); if (strstr(word, key) != NULL) { printf("Find %s In %s\n", key, word); } else { printf("Not Find\n"); } return 0; }

  • ループ中でのscanfおよびcin

    あまりに基礎的な質問ですが,ループ中の入力関数が期待する動作になりません. コードを載せます while (1) { int key; scanf("%d", &key); if (key == 1) break; } 期待する動作は1が入力されるまでループし続けるというものですが scanfは一度しか実行されずループし続けます,cinに変えても同様でした 何が原因か分かる方,ご教示ください

  • C言語(while構文)

    #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c='m'; while(c!='e')//eでない限りwhileループを実行する { sum=sum+i; printf("\n1 kara %d madewo tasuto %d desu.\n",i,sum); i++; printf("nanikakeywo oshitekudasai.owaru tokiha 'e'\n"); c=getch(); } printf("loopwo nukemashita\n"); getch(); } getch()の代わりに、scanf()を使って整数値を入力させ、負の数が入力されたら終了するプログラム(正を入力したら「次の数値を入力せよ」とだして、繰り返す。)を造りたいのですが、どこを変えればよいか教えてください。

専門家に質問してみよう