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回目の入力で未入力とすると、
「登録する名前を入力してください:」の表示後、ループから抜けてしまいます・・・。
どなたか原因と解決策の分かる方がおられたら教えていただけないでしょうか?
No.2ベストアンサー
- 回答日時:
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);
}
----------------------------------------------------------------------
としてみてはどうでしょう。
ありがとうございます。
色々試行錯誤し、strlenで入力文字数が0かどうかを判断させるようにしてしまいました。
アドバイスありがとうございました。
No.3
- 回答日時:
あ~の~
「1回目のループで未入力の場合」, 「2回目のループで未入力の場合」のそれぞれでどのように表示されるのか」, 「どのような動作を期待しているのか」をお示しいただけませんか?
って書いたんですけど, 意味がわかりませんか? いや, 確かにかぎかっこの対応は変ですけど (すみません)....
・「1回目のループで未入力の場合」には「なにも表示されない」のですか?
・「2回目のループで未入力の場合」というのは「1回目だけデータを入力した」ということなんでしょうけど, このときには「登録する名前を入力してください:」の表示はどこで何回ありますか?
・期待されている動作がやはり分かりません. どのようなときにどのような表示がされることを期待しているのですか? そして, どのようなデータであることを望んでいるのですか?
No.1
- 回答日時:
「未入力」=「なにもいれず改行だけした」ということでしょうか?
「1回目のループで未入力の場合」, 「2回目のループで未入力の場合」のそれぞれでどのように表示されるのか」, 「どのような動作を期待しているのか」をお示しいただけませんか?
ご回答ありがとうございます。
>「未入力」=「なにもいれず改行だけした」ということでしょうか?
はい、その通りです。
>「1回目のループで未入力の場合」
ループを抜けました。期待通りです。
>「2回目のループで未入力の場合」
「登録する名前を入力してください:」の表示後、ループから抜けてしまいます。
これは期待と違います。ループから抜ける判定で抜けることなく先頭へ戻ってしまい、上記入力要求メッセージが出力されてしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- Java Java 南京錠 2 2023/02/04 11:46
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
プログラミングの問題です 「金...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
*をユーザーが入力した数字の数...
-
C言語でgetchar();が上手く使え...
-
C言語について
-
OpenCV webカメラ同時出力について
-
C言語
-
fflush(stdin)の使い方とprintf...
-
java初心者です。入力されたの...
-
scanfが2回使えない・・・?;
-
getcharをしながらwhile文で出...
-
C言語 入力した値から0までの数...
-
至急教えてください。プログラ...
-
getchar()について 教えてくだ...
-
"scanf"でエンターで改行させな...
-
プログラミングの問題で、キー...
-
C言語 逆ピラミッドの作り方
-
入力エラーの処理について。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語 逆ピラミッドの作り方
-
double型が正常に認識されてい...
-
ワードで文字を入力する時の変...
-
コマンドプロンプトからのEOFの...
-
Linuxで入力待ちなしkeyread関...
-
scanf が無視されます
-
if文の条件にscanf関数を使うと…?
-
C言語について
-
cout関数を使っているのですが...
-
enterでループ終了
-
"scanf"でエンターで改行させな...
-
C言語でgetchar();が上手く使え...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報