• ベストアンサー

繰り返し条件について2

http://oshiete1.goo.ne.jp/kotaeru.php3?q=947566で質問させていただいたものです。新たな問題が発生してしまいした。 char jouken; do{ 処理 printf("--Press any key to exit(Press 'c' to continue)--"); scanf("%c",&jouken); }while(jouken=='c'); や、 do{ 処理 printf("--Press any key to exit(Press 'c' to continue)--"); }(getchar()=='c'); でプログラムを作ったら一回しか繰り返しが出来ないんです。1回目の処理をして、cを入力すれば、繰り返しになりますが、二回目の処理が終わると全ての処理が終わってしまいます(Press any key to continueとでます)。 何がいけないんでしょうか? MSVC++でc++で作成しています。

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

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

char c1; do{ printf("--Press any key to exit(Press 'c' to continue)--"); c1 = getchar(); getchar(); }while(c1=='c'); のようにすると、うまくいきます。 getchar()関数のところで、'c'を入力したとき、Enterキーを押すので、次回getchar()関数が呼び出されたとき、0x0a='\n'が代入されるからです。

ZZR1200
質問者

お礼

再三のご回答ありがとうございます。 うまくいきました。 コンピュータを思い通りに扱うのは難しいですね。 ありがとうございます。

その他の回答 (4)

回答No.5

#3,#4の者です。 #4の回答の中に間違いがあったので訂正します。 誤 printf("\nc1=%02x\n"); 正 printf("\nc1=%02x" , c1);

回答No.4

#3の者です。 次のように、getchar()で取得した文字を表示させるようにすれば、どうしてうまくいかなかったのか一目瞭然でわかります。 デバッグ段階では、whileの中で、関数呼び出しをせずに、whileの前に関数を置き、結果を出力するようにすると、バグが発見できることがあります。 また、次のコードでは、最初のprintf関数の中の文字列の先頭に\nを加えています。これをつけないと、文字列が横に続けて表示されてしまいます。 int main(int argc, char* argv[]) { char c1; do{ printf("\n--Press any key to exit(Press 'c' to continue)--"); c1 = getchar(); printf("\nc1=%02x\n"); }while(c1=='c'); return 0; } 実行結果 --Press any key to exit(Press 'c' to continue)--c c1=63 ...'c'が入力されていることがわかる --Press any key to exit(Press 'c' to continue)-- c1=0a ...'\n'が入力されていることに気づく また、環境によっては、一文字を取得する関数として、getch()または_getch()(←MSVC Ver6.0の場合)などが用意されています。ただこの関数は、環境依存してしまいますので、それをさけるため、次のコードのように#ifdef~#endifディレクティブを使うと、環境依存を避けることが出来ます。 getch()または、_getch()では、<conio.h>をインクルードする必要があります。 参考コード #include <conio.h> #ifdef getch #define GETCH getch_ #elif defined(_getch) #define GETCH _getch_ #else #error "getch() or _getch() not defined" //getch()関数と_getch()関数の両方とも無い場合はコンパイル時にエラーが出る #endif int main(int argc, char* argv[]) { do{ printf("\n--Press any key to exit(Press 'c' to continue)--"); }while(GETCH()=='c'); return 0; }

  • junneko
  • ベストアンサー率38% (7/18)
回答No.2

cをタイプしてリターンキーを押した場合、 scanf("%c",&jouken)では一度目は'c'を受け取りますが、2度目は改行'\n'を受け取ります。よって繰り返し条件を満たさない為ここで終了してしまいます。 例えば次のようにしてみてはいかがでしょう。 char buf[128]; do { 処理 printf("--Press any key to exit(Press 'c' to continue)--"); fgets(buf,sizeof(buf),stdin); }while( *buf=='c' );

ZZR1200
質問者

お礼

二度目が改行を受け取るって言うのがいまいち理解できませんが、それはおいおいという事にして…。 fgetsをつかうといいみたいですね。ためしてみます。 ありがとうございます。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

cの次は改行文字がプログラムに渡され、cでないので条件が偽になり、ループが終了します。 char jouken[2]; do{ 処理 printf("--Press any key to exit(Press 'c' to continue)--"); fgets(jouken,sizeof jouken,stdin); }while(jouken[0]=='c'); のようにfgetsを使った行入力にして、その先頭文字だけを見るようにします。文字列の終端文字である'\0'を入れるためにjouken配列は最低2文字以上必要です。(fgetsから戻った時はjouken[1]に'\0'が入る) EOF入力(ctrl-Z)にも対応するなら、 char jouken[2]; do{ 処理 printf("--Press any key to exit(Press 'c' to continue)--"); }while(fgets(jouken,sizeof jouken,stdin) && jouken[0]=='c');

ZZR1200
質問者

お礼

>cの次は改行文字がプログラムに渡され、cでないので条件が偽になり、ループが終了します。 そうなんですか??ループの中にscanf入れてるからそう言う問題に関しては全く考えてませんでした。 勉強になりました。ありがとうございます。

関連するQ&A

  • push any key で終了する方法?

    Cでプログラミングしています。 本当に基本的なことで申し訳ないのですが、 どうしても分からないので、 どなたかアドバイス又は ヒントをいただければ助かります。 printf("End of Program\n"); の後に、何かキーを押すとプログラムが終了するようにしたいのですが、現在では、どうしても 1文字入力してからリターンキーを押すという 2操作の方法しかプログラミングできません。 push any keyで終わるための関数について どなたかご教示お願いします。 scanf("%s",&ss); int ch = getchar(); exit(1)

  • CPad for LSI C-86での実行結果

    フリーのソフトCPad for LSI C-86を使ってC言語の学習を行っています。 実行結果が表示されたり表示されなかったり、するのですがなぜでしょうか??(表示されないほうが多いです・・・) 実行結果が表示されない場合は以下の分のみが表示されます。 -- Press any key to exit (Input "c" to continue) -- パソコンはWindowsXPを使用してます。 よろしくお願いします!!

  • OSのセットアップが出来ません

    先日友人にパソコンを組んでもらい、OSを入れようとした所、 Line 6077 of the INF file \i386\txtsetup.sif is invalid Setup cannot continue. Press any key to exit. と表示されてセットアップが出来ません。 BIOSでの設定も間違ってないと思いますが、マザーボードかDDFが壊れてしまったのでしょうか? Press any key to boot from CDの後に出るのですが…。 分かる方何か解決方法がありましたら教えてください、お願いします。

  • Windows立上げ時のトラブル

    Windows立上げの時にPress Any Key to Continueがでます。何かのキーを押すと立ち上がるのですが、どうしたら解消できますか? XPです。 よろしくお教え願ます。

  • getchar関数について

    初歩的なことなのかもしれませんが、お分かりになる方、教えてください。 getchar関数は、 int d; d = getchar(); のようにして使いますよね。 でも、 int c,d; do{  scanf("%d",&c) }while(c!= 0); d = getchar(); のように、getcharの前に繰り返し処理を置くとうまく実行できません。 なぜでしょう? ちなみにソフトはVisual C++6.0をつかってます。 よろしくお願いします。

  • error code 4の意味

    PCが起動できません。 再セットアップしようとすると次のような記述が表示されます。  File setupdd,sys could not be loaded,The error codeis4 Setpu cannot continue,press any key to exit

  • CPad for LSI C-86の実行結果

    こんにちは 現在コンパイラLSI C-86試食版と CPad for LSI C-86を使ってC言語を勉強しているのですが 何故か実行結果が表示される時とされない時があります。 内容は以下の簡単なものです。 #include <stdio.h> int main(void) { printf("Hello,world\n"); return 0; } ファイルを開いた直後などは実行結果が表示されることが多いのですが 大半(2/3ほどの確率で)の実行結果では C:\Program Files\~~~ -- Press any key to exit (Input "c" to continue) -- としか出ません。 使用OSはWindowsXPで 設定→コンパイラのパス のところと 高度な設定→実行するコマンド のところは FAQに従っています。 一体どこがおかしいのでしょうか? 回答よろしくお願いします。

  • 違いは何?

    for(i = 0; i < 5; i++){  printf("#%d", i + 1);  getchar(); } getcharではenterキーを押すとします。 これだと実行結果は #1 #2 #3 #4 となります。しかし、 printf("入力回数:"); scanf("%d", &n); for(i = 0; i < n; i++){ printf("#%d", i + 1); getchar(); } これだと実行結果は 入力回数:4 #1#2 #3 #4 となり、なぜか#1のときのgetcharが無視されてしまいます。 なんでこうなるのか教えて欲しいです。

  • OSのセットアップの時

    WindowsXPをインストールするためにCDをいれてWindows setupの画面までいくのですが、しばらくしたら 「File setupdd.sys could not be loaded. The error code is 4 Setup cannot continue.Press any key to exit.」 と表示されセットアップ出来ません。。 どうしたらいいでしょうか?

  • 3次方程式の実数解の個数のプログラムについて…

    C++で、3次方程式の実数解の個数を調べるプログラムを作ってみた(↓)のですが、実行したときに問題点があって困っています。 #include<stdio.h> #include<math.h> void main(void) /*3次方程式の実数解の個数*/ { double a,b,c,d,D,A,B; printf("f(x)=a*pow(x,3)+b*pow(x,2)+c*x+d=0 に対して、a,b,c,dの値を定めると、\n"); scanf("%lf %lf %lf %lf",&a,&b,&c,&d); D=4*pow(b,2)-12*a*c; A=(-b+sqrt(b*b-3*a*c))/(3*a); B=(-b-sqrt(b*b-3*a*c))/(3*a); if(a>0) if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); else a=-a; b=-b; c=-c; d=-d; if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); その問題点というのは、実数解の個数が2個と3個のときは、実行したときの結果として、 実数解の個数は2個 Press any key to continue あるいは 実数解の個数は3個 Press any key to continue と正しく表示されるのですが、実数解の個数が1個のときは、 実数解の個数は1個 実数解の個数は1個 Press any key to continue と「実数解の個数は1個」が2回表示されてしまうのです。 なぜ、2回表示されるのか分かりません。 初心者なので、できるだけ詳しい解決法などよろしくお願い致します。

専門家に質問してみよう