web-dev-qa-db-ja.com

scanf()の後にgetchar()がEnterキーを押すのを待たないのはなぜですか?

私はCを学習していて、「getchar()」を使用してコマンドウィンドウを停止しているので、演習が実行されていることを確認できますが、機能しません。ここにサンプルがあります:

#include <stdio.h>

int main()
{
    int value;
    printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: ");
    scanf("%d", &value);
    switch (value)
    {
        case 1:
            printf("you selected the option 1.");
            break;
        case 2:
            printf("you selected the option 2.");
            break;
        case 3:
            printf("you selected the option 3.");
            break;
        case 4:
            printf("goodbye");
            break;
        default:
            printf("thats not an option");
            break;
    }
    getchar();
    return 0;
}

これは出力です:

  1. オプション1。
  2. オプション2。
  3. オプション3。
  4. 出口。

オプションを作成します:1

オプション1を選択しました。

プロセスが0(0x0)の実行時間を返しました:3.453秒

何かキーを押すと続行します。

「getchar()」の入力を待たないのはなぜですか?

16
user158057

あなたのscanfは番号だけを食べ、末尾の改行は食べませんでした。 %dの後に改行または空白を置くと、逆の問題が発生し、読みすぎになります。

これが、人々がscanfを嫌う理由です。

実際の行を読んで(fgets(3)を使用)、次にsscanf()を使用して文字列をスキャンすることをお勧めします。

22
DigitalRoss

まず、do not fflush()を使用して入力ストリームをクリアします。動作は未定義です:

7.19.5.2.2ストリームが、最新の操作が入力されていない出力ストリームまたは更新ストリームを指している場合、fflush関数により、そのストリームの未書き込みデータがホスト環境に配信され、ファイルに書き込まれます。それ以外の場合、動作は定義されていません。

問題は、末尾の改行が「%d」変換指定子によって消費されていないため、getchar()によってすぐに取得されることです。これに対処する最善の方法は1つではありませんが、一般的なアプローチは、行全体をテキストとして読み取ることです(fgets()またはscanf()のいずれかをサイズ "%s"変換指定子で使用します) 、改行を消費し、sscanf()またはstrtol()またはstrtod()を使用してターゲットデータ型に変換します。

8
John Bode

Getcharは、1の後に入力したキャリッジリターンを取得できますか?

3
John Lockwood

キャリッジリターンを取得しています。これを回避し、文字を定義して、キャリッジリターンをスキャンするだけです。

_char ch;_(getch()の前に次のように入力します)scanf("%c",&ch); getchar();

これを行うための最も効率的な方法ではありませんが、私にとってはうまくいくはずです。

2
Naveed Choudhry

Getchar()は、scanfのキーボードから\ nを読み取っています-詳細については、 ここ を参照してください

2
Preet Sangha

「1」を入力してからEnterを入力したと思います。これはgetchar()によって受け入れられます。したがって、元の関数の後に(_return 0;_の直前に)getchar()を追加するだけで、問題を解決できます。

**これをテストしたところ、機能しました。

2
zxeoc

すでに述べたように、scanfはユーザー入力を読み取った後\ nを残します。

Soultion: scanfの直後にgetchar()を追加します。

それはscanfの不足を補います。

つまり.

int value; 
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
scanf("%d", &value);
getchar();
switch (value) 
1
Alex

他の回答を読んでいると、scanf("%d\n",&n);の代わりにscanf("%d",&n);を使用して、バッファから新しい行を削除できることがわかりました。私はこれをチェックしていません。

それがうまくいくことを願っています:D

0
Jayanta Banik