• ベストアンサー

改行のせい(?)で入力がうまくいきません

改行のせい(?)で入力がうまくいきません C言語でプログラムを組んでいるのですが 入力したいところが飛ばされてしまいます。 例えばプログラムの一部ですが int main(void) { char file_name[15]; char option[5]; while(1) { printf("0: Quit\n"); printf("1: Count the number of characters\n"); printf("2: Pass or fail\n"); printf("3: Prime numbers\n"); printf("Choose an option from above: "); scanf("%s", &option); if(option[0]=='1') { printf("Enter the external name of the file: "); gets(file_name); printf("The number of characters in the text file is %d.\n\n", countText(file_name)); continue; } else if (option[0]=='2') { passFail(); continue; のoptionで'1'と入力してリターンを押すと file_nameを入力する機会を与えてくれず、「ファイル名がない」と怒られて 終了してしまいます。 きっと改行のせいだと思うのですが、どうしていいのか分かりません。 最初はchar型にしてたのですがstring型にして 最初の一文字だけ見るようにしましたけどダメです。 getcharなんて使えないですよね…。 「改行 入力 LF」なんてキーワードで検索やってみたんですけど見つかりませんでした。 Windows XP, Visual C++ Version 5.0を使っています。 どなたか解決方法を教えて下さい。

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

  • ベストアンサー
  • pureh
  • ベストアンサー率69% (36/52)
回答No.2

fflush(stdin); を scanf の直後の行に挿入する(参考URL)。 または、 後ろの gets を scanf に置き換える。 http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/c/C-faq/C-faq-12.html の 12.18: をご覧ください。    

参考URL:
http://www.borland.co.jp/qanda/lang/l0002014.html
ginkgo
質問者

お礼

治りました(^O^)/ まぁ、そんなコマンドが用意されてるんですね。 なんか、トイレのフラッシュみたいですね(^.^) それならいっそscanfの仕様を変えてほしいんですが… そういう訳にもいかないんでしょうね。 両方のURLも良い参考になりました。 C-faqもあるんですね。Java-faqだけかと思ってました。 これからどんどん利用させてもらおうと思います。 ありがとうございました。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

scanfは非常に使い方が難しい関数です。初心者は使わないほうがいいでしょう。ちゃんとしたCの入門書なら「使うな」と書いてあるはずです。 1 リターン と入力したうち、scanf("%s",&option)では1だけが処理され、リターンは入力バッファに残ったままです。続いてgetsが実行されると残っていたリターンのみが入力された扱いになり、file_nameは空文字列になります。 scanfをfgets(option,sizeof option,stdin)に変えたほうがいいでしょう。 また、gets(file_name) も15文字以上入力した場合に他の変数の値を破壊したりプログラムが異常終了したりしますので、getsも(使い捨てプログラムでない限り)使ってはいけない関数です。fgetsを使って書き直すべきですが、改行文字の扱いの仕様が違うので、マニュアルでgetsとfgetsの仕様の違いを確認してください。 scanfの "%s" を "%s " か "%s\n" に変えると、入力内容によってはとりあえず期待の動作をするかもしれませんが、止めたほうがいいでしょうね。

ginkgo
質問者

お礼

scanfをfgets(option,sizeof option,stdin)に変えてみました。 sizeof optionを2にしたのですが症状は変わりませんでした。 sizeof optionを1にすると止まらなくなりました。 ←そりゃそうか(^^ゞ scanfの"%s"を"%s "に変えてみました。 私のVisual C++ではoptionのところで二回入力しないといけないみたいです。 二回目の結果は次のfile_nameに入るのですが 入力した後に"Choose an option from above: "と聞いてくるので ちぐはぐになってしまいます。 "%s\n"もまったく同様です。 私も検索していて「初心者はscanfを使うな」という記述を見つけました。 ただ、他の方法が見つからなかったんですよね。 本に載っているプログラム例にもscanfが使われていますし…困りましたね。 こういう面ではやっぱりJavaやC++の方がいいですね。 ありがとうございました。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

>getcharなんて使えないですよね…。 なぜ? scanf("%s", &option); を option[0] = (char)getchar(); と変えてみてはいかがですか?

ginkgo
質問者

お礼

あ、使えましたね。 どうやらぁゃιぃ使い方をしていたようです…。 scanfに倣ってgetchar(&option);とか(恥) ただ、症状は同じで問題の解決には至りませんでした。 同じことをするのにいろんな方法があるのって 便利かと思いきや不便ですね…。 ありがとうございました。

関連するQ&A