web-dev-qa-db-ja.com

コンソールからcharを読み取る

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

この問題はどのように解決できますか?

9
Yakov

これは、scanfが入力ストリームに入力した改行を残すためです。試してみてください

do
    c = getchar();
while (isspace(c));

の代わりに

c = getchar();
12
Fred Foo

Fflush関数を使用して、前のコマンドライン入力の結果としてバッファーに残っているものをすべてクリアできます。

fflush(stdin);
2
ETFovac

目的の文字の前のスペースをクリーンアップし、残りの文字を無視する方法は次のとおりです。

do {
    c = getchar();
} while (isspace(c));
while (getchar() != '\n');
2
Josué

まず、scanfscanf("%d\n", &x);またはyを読み取る必要があります。それでうまくいくはずです。

man scanf

1
Ed Heal

scanfの後にfflush(stdin);を呼び出して、scanfによって残された不要な文字(\ r\nなど)を入力バッファーから破棄します。

編集:コメントの人が言及したように、fflushソリューションには移植性の問題がある可能性があるので、これが私の2番目の提案です。 scanfはまったく使用せず、fgetssscanfの組み合わせを使用してこの作業を行ってください。間違った入力状況を処理できるため、これははるかに安全で単純なアプローチです。

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();
1
Zuljin