9

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

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

4

5 に答える 5

12

これはscanf、入力ストリームに入力した改行を残すためです。試す

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

それ以外の

c = getchar();
于 2012-01-13T15:46:37.807 に答える
2

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

編集:コメントの人が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();
于 2012-01-13T16:03:48.897 に答える
2

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

do {
    c = getchar();
} while (isspace(c));
while (getchar() != '\n');
于 2013-07-09T23:14:45.963 に答える
2

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

fflush(stdin);
于 2014-06-24T10:15:59.143 に答える
1

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

man scanf

于 2012-01-13T15:47:27.903 に答える