QA@IT

fputsの入力待ちが飛ばされてしまいます

4035 PV

以下のプログラムでscanfで条件選択をした後のfputsが入力待ちをしないで処理してしまいます。
おそらくscanfでのenterキーが改行文字として入力されているんだと思います。どう解決したら良いのでしょうか?
使用言語:C 環境:Windows, GCC, コマンドプロンプト

#include <stdio.h>
#include <stdlib.h>
int main(){
  while(1){
    int i;
    puts("形式を選択してください");
    puts("1.文字列  2.数字  3.終了");
    scanf("%d",&i);

    if(i==1){
      char a;
      char wrds[256];
      puts("好きな文を入力してください");
      puts("<!> 文字数は最大255文字");

      fgets(wrds, sizeof(wrds), stdin);

      puts("入力された文章");
      printf(">%s\n",wrds);
      char *p_wrd = wrds;
      printf("入力されたデータのアドレス = %d\n",p_wrd);

    }else if(i==2){
      int fig;
      puts("自然数を入力してください");
      scanf("%d",&fig);
      int *p_fig = &fig;

      printf("入力された数字 = %d\n",fig);
      printf("入力されたデータのアドレス = %p\n",p_fig);
      printf("入力されたデータのエイリアス = %d\n",*p_fig);
    }else if(i==3){
      puts("終了します");
      break;
    }else{
      puts("1~3のいずれかを入力してください");
    }
  }

  return EXIT_SUCCESS;
}

回答

scanfで改行('\n')を除去する方法です。

コード8-9行目

    puts("1.文字列  2.数字  3.終了");
    scanf("%d%*c",&i);

コード26-27行目

      puts("自然数を入力してください");
      scanf("%d%*c",&fig);
編集 履歴 (0)
  • ありがとうございます。解決しました。
    %c追加で改行を読みすてられるんですね。
    -
scanf("%d",&i);

これだと1文字読むだけですが入力は
数字の後エンターを押下していると思います。

scanf("%d\n",&i);

にしてみてはどうでしょう?

編集 履歴 (0)
  • 回答ありがとうございます。
    実行してみたところ、
    入力待ちは2回になるのですが、

    puts("好きな文を入力してください");
    puts("<!> 文字数は最大255文字");

    が実行される前に入力待ちがされ、その後のfgets()は飛ばされるようです。
    -
  • 先の\nはやめて
    stdinからの読込の後

    fflush(stdin);

    はどうでしょう?
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。