20

私は 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()」の入力を待たないのはなぜですか?

4

10 に答える 10

23

あなたの scanf は数字だけを食べましたが、末尾の改行は食べませんでした。%d の後に改行または空白を入れると、反対の問題が発生し、読みすぎます。

これが、人々が scanf を好まない理由です。

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

于 2009-09-08T01:36:09.517 に答える
8

まず第一に、入力ストリームをクリアするために fflush() を使用しないでください。動作は未定義です:

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

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

于 2009-09-08T03:50:52.503 に答える
3

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

于 2009-09-08T01:36:04.493 に答える
2

あなたはキャリッジリターンを取得しています。私がそれを回避する方法で、charを定義し、キャリッジリターンをスキャンするだけです.

char ch; ( getch() の前に以下を入力してください) scanf("%c",&ch); getchar();

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

于 2011-12-13T00:44:30.783 に答える
2

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

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

これにより、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) 
于 2013-02-13T13:11:03.727 に答える
2

「1」を入力した後にエンターを入力したと思います。によって受け入れられます。そのため、元の問題の後に ( の直前に)getchar()を追加するだけで問題を解決できます。getchar()return 0;

**これをテストしたところ、うまくいきました。

于 2009-09-08T01:44:49.437 に答える
2

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

于 2009-09-08T01:37:36.440 に答える
-10

プログラムが機能するためには、fflush(stdin) を呼び出して getchar() を呼び出す前に、入力ストリームを「フラッシュ」する必要があります。これが何をするかというと、キーボードで数字を入力してからリターン キーを押すと、入力バッファーは両方の文字 (たとえば '1' と '\n') を取得し、scanf への呼び出しは '1' のみを取得するため、' \n' は入力バッファに残ります。getchar を呼び出すと、残りの '\n' が「取得」されます。入力をフラッシュすると、すべてのバッファが破棄されます。

于 2009-09-08T01:36:48.377 に答える