
#include <stdio.h>
int main(void)
{
char name[10];
int no;
printf("ナンバーを入力してください: ");
scanf("%d",&no);/* 35を入力 */
printf("文字列を入力してください: ");
fgets(name,10,stdin);/*入力できない*/
return 0;
}
この例文だと、fgets関数が改行コードを読み取って、終了してしまい文字列入力が出来ないみたいなんですが、scanfの後にfgetsを使うような(scanfとfgetsの間にscanfの残した?改行コードを取り除く方法)処理はどのような方法があるのでしょうか?
試しにfgets文を2度書いたら思っていた動作をしてくれたのですが、はたしてfgets文を2度書くというような事をしていいものなのでしょうか?見た目もなんだか変な感じですし。。↓
#include <stdio.h>
int main(void)
{
char name[10];
int no;
printf("ナンバーを入力してください: ");
scanf("%d",&no);/* 35を入力 */
printf("文字列を入力してください: ");
fgets(name,10,stdin);
fgets(name,10,stdin); /*入力できる*/
return 0;
}
No.2ベストアンサー
- 回答日時:
余計なfgetsを削除し
scanf("%d",&no);
を
scanf("%d",&no);
scanf("%*[^\n]%*c");
にする。
#include <stdio.h>
int main(void)
{
char name[10];
int no;
printf("ナンバーを入力してください: ");
scanf("%d",&no); /* 35を入力 */
scanf("%*[^\n]%*c");
printf("文字列を入力してください: ");
fgets(name,10,stdin); /*入力できる*/
return 0;
}
「35<Enter>」と入力すると、scanfは「35」までを数値に変換し、noに代入します。
入力ストリームにある「<Enter>」は「置き去り」にされます。
その後
scanf("%*[^\n]%*c");
を実行すると「%*[^\n]で、改行以外の文字があるなら、改行の手前にある文字をすべて読み捨て」してから「%*cで、次の文字、つまり、改行を読み捨て」します。
これで「置き去りにされた<Enter>」が入力ストリームから居なくなります。
あとは、普通にfgetsするだけ。
ご回答ありがとうございます。
思っていた動きをしたのですが次のようなソースにした場合、文字列が入力できませんでした・・・(ナンバー、基本地しか入力できない)環境はVisual c++ 2010です。
#include <stdio.h>
int main(void)
{
char name[10];
int no,kihon;
printf("ナンバーを入力してください: ");
scanf("%d",&no); /* 35を入力 */
scanf("%*[^\n]%*c");
printf("文字列を入力してください: ");
fgets(name,10,stdin);
printf("基本値を入力してください:");
scanf("%d",&kihon);
return 0;
}
ただBorland C++ Compiler 5.5で実行すると希望の動作になりました(ナンバー、文字列、基本値の3つの入力が可能。)
どこが悪いんでしょうか・・
No.4
- 回答日時:
そもそも、対話式に入力したいのなら、一切scanfをつかわず、全部fgetsで入力し、必要に応じてsscanf等を使う。
scanfの戻り値をチェックしてないのもだめです(sscanfもチェック要)。
No.3
- 回答日時:
因みに。
「改行以外の文字があるなら、改行の手前にある文字をすべて読み捨て」
と言う処理をするのは、最初の入力で「35,123,aaa<Enter>」とかって入力されるかも知れないから。
なので「35」と「<Enter>」の間にある、余計な文字列「,123,aaa」を読み捨てするのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイルで、キーボード...
-
if文の条件にscanf関数を使うと…?
-
キーボードを押すまで処理を中...
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
scanfについて
-
[至急]Project Euler:#13Large ...
-
java初心者です。入力されたの...
-
Meadow
-
漢字のソートについて
-
scanfが2回使えない・・・?;
-
C言語・YesNo入力のループで解...
-
2進数の1の数を数える問題
-
getcharをしながらwhile文で出...
-
scanf関数について
-
【シェル】ループの中で対話処...
-
プログラミングの問題です 「金...
-
switch文 defaultについて
-
電卓の小数点
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
プログラミング初心者です。 Py...
-
C言語でgetchar();が上手く使え...
-
Excel VBAで、Application.Inpu...
-
電卓の小数点
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
小数か整数かを判定する方法
-
至急教えてください!プログラ...
-
getchar()について 教えてくだ...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
コマンドプロンプトからのEOFの...
-
IF文で戻ることはできますか?...
-
プログラミングの問題です 「金...
おすすめ情報