从控制台读取字符

时间:2012-01-13 15:44:06

标签: c scanf getchar

我编写控制台应用程序,为i​​nt执行多个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

如何解决这个问题?

5 个答案:

答案 0 :(得分:12)

这是因为scanf会留下您在输入流中输入的换行符。尝试

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

而不是

c = getchar();

答案 1 :(得分:2)

在你想要的字符之前清理anyspace并忽略其余字符的方法是

do {
    c = getchar();
} while (isspace(opcao));
while (getchar() != '\n');

答案 2 :(得分:2)

您可以使用fflush函数清除缓冲区中剩余的任何内容,作为先前命令行输入的后果:

fflush(stdin);

答案 3 :(得分:1)

首先,scanf应为scanf("%d\n", &x);或y。这应该可以解决问题。

man scanf

答案 4 :(得分:1)

fflush(stdin);之后调用scanf以丢弃scanf留下的输入缓冲区中任何不必要的字符(如\ r \ n)。

编辑:正如评论中提及的fflush解决方案可能存在可移植性问题,所以这是我的第二个提案。不要使用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();