Intに対していくつかのscanfを実行するコンソールアプリケーションを作成し、その後、getcharを実行します。
int x,y;
char c;
printf("x:\n");
scanf("%d",&x);
printf("y:\n");
scanf("%d",&y);
c = getchar();
この結果、私はc = '\n'
、入力は次のとおりですが:
1
2
a
この問題はどのように解決できますか?
これは、scanf
が入力ストリームに入力した改行を残すためです。試してみてください
do
c = getchar();
while (isspace(c));
の代わりに
c = getchar();
Fflush関数を使用して、前のコマンドライン入力の結果としてバッファーに残っているものをすべてクリアできます。
fflush(stdin);
目的の文字の前のスペースをクリーンアップし、残りの文字を無視する方法は次のとおりです。
do {
c = getchar();
} while (isspace(c));
while (getchar() != '\n');
まず、scanf
はscanf("%d\n", &x);
またはyを読み取る必要があります。それでうまくいくはずです。
scanf
の後にfflush(stdin);
を呼び出して、scanf
によって残された不要な文字(\ r\nなど)を入力バッファーから破棄します。
編集:コメントの人が言及したように、fflush
ソリューションには移植性の問題がある可能性があるので、これが私の2番目の提案です。 scanf
はまったく使用せず、fgets
とsscanf
の組み合わせを使用してこの作業を行ってください。間違った入力状況を処理できるため、これははるかに安全で単純なアプローチです。
int x,y;
char c;
char buffer[80];
printf("x:\n");
if (NULL == fgets(buffer, 80, stdin) || 1 != sscanf(buffer, "%d", &x))
{
printf("wrong input");
}
printf("y:\n");
if (NULL == fgets(buffer, 80, stdin) || 1 != sscanf(buffer, "%d", &y))
{
printf("wrong input");
}
c = getchar();