私は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。
- オプション2。
- オプション3。
- 出口。
オプションを作成します:1
オプション1を選択しました。
プロセスが0(0x0)の実行時間を返しました:3.453秒
何かキーを押すと続行します。
「getchar()」の入力を待たないのはなぜですか?
あなたのscanfは番号だけを食べ、末尾の改行は食べませんでした。 %dの後に改行または空白を置くと、逆の問題が発生し、読みすぎになります。
これが、人々がscanfを嫌う理由です。
実際の行を読んで(fgets(3)
を使用)、次にsscanf()
を使用して文字列をスキャンすることをお勧めします。
まず、do not fflush()を使用して入力ストリームをクリアします。動作は未定義です:
7.19.5.2.2ストリームが、最新の操作が入力されていない出力ストリームまたは更新ストリームを指している場合、fflush関数により、そのストリームの未書き込みデータがホスト環境に配信され、ファイルに書き込まれます。それ以外の場合、動作は定義されていません。
問題は、末尾の改行が「%d」変換指定子によって消費されていないため、getchar()
によってすぐに取得されることです。これに対処する最善の方法は1つではありませんが、一般的なアプローチは、行全体をテキストとして読み取ることです(fgets()
またはscanf()
のいずれかをサイズ "%s"変換指定子で使用します) 、改行を消費し、sscanf()
またはstrtol()
またはstrtod()
を使用してターゲットデータ型に変換します。
Getcharは、1の後に入力したキャリッジリターンを取得できますか?
キャリッジリターンを取得しています。これを回避し、文字を定義して、キャリッジリターンをスキャンするだけです。
_char ch;
_(getch()の前に次のように入力します)scanf("%c",&ch); getchar();
これを行うための最も効率的な方法ではありませんが、私にとってはうまくいくはずです。
Getchar()は、scanfのキーボードから\ nを読み取っています-詳細については、 ここ を参照してください
「1」を入力してからEnterを入力したと思います。これはgetchar()
によって受け入れられます。したがって、元の関数の後に(_return 0;
_の直前に)getchar()
を追加するだけで、問題を解決できます。
**これをテストしたところ、機能しました。
すでに述べたように、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)
他の回答を読んでいると、scanf("%d\n",&n);
の代わりにscanf("%d",&n);
を使用して、バッファから新しい行を削除できることがわかりました。私はこれをチェックしていません。
それがうまくいくことを願っています:D