- ベストアンサー
fgetsとループ処理
C言語の勉強をしております。 http://oshiete1.goo.ne.jp/qa4436782.html での質問に付随することなのですが、新しく立てさせていただきました。 キーボードからの入力で、何も入力されない場合にループから抜けたいんですが、以下のように記述すると、fgetsが飛ばされてしまいました。 char buffer[80]; int i; for(i = 0; i < 1000; i++){ memset(buffer, 0, sizeof(buffer)); printf("登録する名前を入力してください:"); fgets(buffer, sizeof(buffer)-1, stdin); /* 名前が未入力でEnterされた場合 */ if(buffer[0] == '\n'){ /* ループを抜ける */ break; } } sscanf(buffer, "%s", work_pt->names); 1回目のループで未入力とすると正常にループから抜けるんですが、 データを1度入力してから2回目の入力で未入力とすると、 「登録する名前を入力してください:」の表示後、ループから抜けてしまいます・・・。 どなたか原因と解決策の分かる方がおられたら教えていただけないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
sscanfのタイミングが悪いと思いますよ。 fgetsで/* 名前が未入力でEnterされた場合 */のbufferを使用して、sscanf() を実行しているために、sscanf内で何か不正な動作をしているのではないでしょうか。 ---------------------------------------------------------------------- char buffer[80]; int i; for(i = 0; i < 1000; i++){ memset(buffer, 0, sizeof(buffer)); printf("登録する名前を入力してください:"); fgets(buffer, sizeof(buffer)-1, stdin); /* 名前が未入力でEnterされた場合 */ if(buffer[0] == '\n'){ /* ループを抜ける */ break; } sscanf(buffer, "%s", work_pt->names); } ---------------------------------------------------------------------- としてみてはどうでしょう。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
あ~の~ 「1回目のループで未入力の場合」, 「2回目のループで未入力の場合」のそれぞれでどのように表示されるのか」, 「どのような動作を期待しているのか」をお示しいただけませんか? って書いたんですけど, 意味がわかりませんか? いや, 確かにかぎかっこの対応は変ですけど (すみません).... ・「1回目のループで未入力の場合」には「なにも表示されない」のですか? ・「2回目のループで未入力の場合」というのは「1回目だけデータを入力した」ということなんでしょうけど, このときには「登録する名前を入力してください:」の表示はどこで何回ありますか? ・期待されている動作がやはり分かりません. どのようなときにどのような表示がされることを期待しているのですか? そして, どのようなデータであることを望んでいるのですか?
お礼
熱心なご指摘ありがとうございます。 色々試行錯誤して、とりあえず解決いたしました。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
「未入力」=「なにもいれず改行だけした」ということでしょうか? 「1回目のループで未入力の場合」, 「2回目のループで未入力の場合」のそれぞれでどのように表示されるのか」, 「どのような動作を期待しているのか」をお示しいただけませんか?
お礼
ご回答ありがとうございます。 >「未入力」=「なにもいれず改行だけした」ということでしょうか? はい、その通りです。 >「1回目のループで未入力の場合」 ループを抜けました。期待通りです。 >「2回目のループで未入力の場合」 「登録する名前を入力してください:」の表示後、ループから抜けてしまいます。 これは期待と違います。ループから抜ける判定で抜けることなく先頭へ戻ってしまい、上記入力要求メッセージが出力されてしまいます。
お礼
ありがとうございます。 色々試行錯誤し、strlenで入力文字数が0かどうかを判断させるようにしてしまいました。 アドバイスありがとうございました。