- ベストアンサー
繰り返し条件について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++で作成しています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
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'が代入されるからです。
その他の回答 (4)
- miswaki777
- ベストアンサー率47% (11/23)
#3,#4の者です。 #4の回答の中に間違いがあったので訂正します。 誤 printf("\nc1=%02x\n"); 正 printf("\nc1=%02x" , c1);
- miswaki777
- ベストアンサー率47% (11/23)
#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)
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' );
お礼
二度目が改行を受け取るって言うのがいまいち理解できませんが、それはおいおいという事にして…。 fgetsをつかうといいみたいですね。ためしてみます。 ありがとうございます。
- notnot
- ベストアンサー率47% (4900/10358)
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');
お礼
>cの次は改行文字がプログラムに渡され、cでないので条件が偽になり、ループが終了します。 そうなんですか??ループの中にscanf入れてるからそう言う問題に関しては全く考えてませんでした。 勉強になりました。ありがとうございます。
お礼
再三のご回答ありがとうございます。 うまくいきました。 コンピュータを思い通りに扱うのは難しいですね。 ありがとうございます。