• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:scanfの後のfgetsについて)

scanfとfgetsの使い方と注意点について

このQ&Aのポイント
  • fgets関数が改行コードを読み取って、終了してしまい文字列入力ができない場合、scanfとfgetsを組み合わせて利用する方法があります。
  • 具体的には、scanfの後にfgetsを使用し、改行文字を読み込むようにします。
  • また、fgetsを2度使用することで、文字列の入力が可能になりますが、見た目やコードの可読性に影響があるため、適切な方法ではありません。

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

  • ベストアンサー
回答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するだけ。

cilles
質問者

お礼

ご回答ありがとうございます。 思っていた動きをしたのですが次のようなソースにした場合、文字列が入力できませんでした・・・(ナンバー、基本地しか入力できない)環境は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つの入力が可能。) どこが悪いんでしょうか・・

その他の回答 (3)

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

そもそも、対話式に入力したいのなら、一切scanfをつかわず、全部fgetsで入力し、必要に応じてsscanf等を使う。 scanfの戻り値をチェックしてないのもだめです(sscanfもチェック要)。

cilles
質問者

お礼

なるほど・・・そういうやり方もあるのですね。勉強になりました。

回答No.3

因みに。 「改行以外の文字があるなら、改行の手前にある文字をすべて読み捨て」 と言う処理をするのは、最初の入力で「35,123,aaa<Enter>」とかって入力されるかも知れないから。 なので「35」と「<Enter>」の間にある、余計な文字列「,123,aaa」を読み捨てするのです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

いろいろとやり方はある. ベタに int ch; while ((ch = getchar()) != '\n'); でもいいし.

cilles
質問者

お礼

そういうやり方があるんですね。勉強になりました。ありがとう。

関連するQ&A

専門家に質問してみよう