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(stdin);
後に呼び出して、。scanf
によって残された不要な文字(\ r \ nなど)を入力バッファーから破棄しscanf
ます。
編集:コメントの人が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();
目的の文字の前のスペースをクリーンアップし、残りの文字を無視する方法は次のとおりです。
do {
c = getchar();
} while (isspace(c));
while (getchar() != '\n');
fflush関数を使用して、以前のコマンドライン入力の結果としてバッファに残っているものをすべてクリアできます。
fflush(stdin);
まず、scanf
読み取りscanf("%d\n", &x);
またはyを実行する必要があります。それでうまくいくはずです。