• ベストアンサー

scanfが実行されません

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

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

  • ベストアンサー
  • owlcity
  • ベストアンサー率56% (45/79)
回答No.2

#1です。事情がわかりましたので、ヒントだけ。 おそらく、各scanfで改行文字も一緒に読み取っていることが原因だと思われます。 (ためしに、最初のyとn以外の文字入力の際、a+Enterではなくて、abcabc+Enterとしてみてください。どんな動作をしますか?) http://www9.plala.or.jp/sgwr-t/c/sec05.html の「5-4.scanf()の注意事項」の箇所や、 http://wisdom.sakura.ne.jp/programming/c/c58.html をご覧になると、今回の不具合の原因がわかります。 最初のdoループの不具合(1番目のscanf)が解消されれば、問題のscanf(2番目)の問題も解消されますよ。 なお、今回のような場合にはscanfよりも、stdio.hのgetcharや、あるいは可能であれば conio.hのgetchやgetcheなどの使用をおすすめします。 http://www.oct.zaq.ne.jp/mizuho/webpage/anchoko/c/io.html などもご覧の上、研究なさってください。 また、#1での回答の主旨と重複するアドバイスになりますが、 プログラム全体を書いてから不良箇所の検証を行うよりも、 たとえば今回の場合最初のdoループの文字読み取り機能が確実なことをコンパイルして動作確認した上で、次の機能を書く、ということを繰り返すほうが、問題箇所を突き止めやすく、また言語の学習にもなると思います。 参考になりましたら幸いです。

ondy
質問者

お礼

何度もありがとうございます。 owlcityさんのおっしゃる通りでした。abcabc+Enterと入力してみて目からウロコが落ちるようでした。 URLやアドバイスもとても参考になります。 助かりました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

{}の組み合わせがおかしいような気がします。 あと、scanfで一文字入力するところで、改行が入力されているのが2回回る原因じゃないかと思います。 %*cで一文字(改行分)を捨ててみてはどうでしょう。 ----------------------------------------------------------- #include <stdio.h> int main(void){ char q,a,f; printf("プログラムを実行しますか?\n"); do{ printf("y(yes)かn(no)を入力してください。"); scanf("%c%*c",&q); }while(q!='y' && q!='n'); if(q=='n'){ printf("プログラムを終了します。"); }else{ do{ do{ printf("AからHまでで、好きなものを選んで大文字で入力してください。\n"); scanf("%c%*c",&a); }while(!(a>='A' && a<='H')); switch(a){ case 'A': printf("文A"); break; case 'B': printf("文B"); break; case 'C': printf("文C"); break; case 'D': printf("文D"); break; case 'E': printf("文E"); break; case 'F': printf("文F"); break; default: printf("文X"); break; } printf("\nもう一度やりますか?"); do{ printf("\nc(続ける)かe(やめる)を入力してください。"); scanf("%c%*c",&f); }while(f!='c' && f!='e'); } while(f!='e'); } return 0; }

ondy
質問者

お礼

実は自分が読んでいるテキストに改行分の一文字を捨てるという説明がどこにも書いてなかったもので、今回初めて知りました。 %*cを加えたらうまくいきました。 本当にありがとうございました。

  • owlcity
  • ベストアンサー率56% (45/79)
回答No.1

こんにちは。 どのようにCで書いておられるのかが具体的にわからないのでなんともいえないんですが、 scanfの使い方を確認の上、 scanfの直後にprintfでそのchar変数を出力してみることをおすすめします。 この出力の確認ができてからループの検討に入るほうがよろしいかと思います。

ondy
質問者

補足

/*回答ありがとうございます。実はscanfが実行されない以外にも色々と変なことが起きるもので、具体的にソースコードを書きました。Cの練習問題として書いたものです。問題が起きるところにコメントを書いておきました。長いですが、もしよろしかったら教えてください。*/ #include <stdio.h> int main(void) { char q,a,f; printf("プログラムを実行しますか?\n"); do{ printf("y(yes)かn(no)を入力してください。"); /*下のscanfでy、n以外の文字をわざと代入するとprintfが二回実行される。*/ scanf("%c",&q); }while(q!='y' && q!='n'); if(q=='n'){ printf("プログラムを終了します。"); } else{ do{ printf("AからHまでで、好きなものを選んで大文字で入力してください。\n"); scanf("%c",&a);/*これが実行されない*/ while(!(a>=65 && a<=72)){ printf("\nAからHまでのアルファベットを大文字で入力してください。"); /*下のscanfでAからHまでのアルファベット以外の文字を代入するとprintfが二回実行される*/ scanf("%c",&a); } switch(a){ case 'A': printf("文A"); break; case 'B': printf("文B"); break; case 'C': printf("文C"); break; case 'D': printf("文D"); break; case 'E': printf("文E"); break; case 'F': printf("文F"); break; default: printf("文X"); break; } printf("\nもう一度やりますか?"); do{ printf("\ne(続ける)かc(やめる)を入力してください。");/*このprintfが二回実行される*/ scanf("%c",&f); }while(f!='c' && f!='e'); } while(f!='e'); printf("プログラムを終了します。"); } return 0; }

関連するQ&A