从控制台读取字符

问题描述 投票:9回答:5

我编写控制台应用程序,它对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

如何解决此问题?

c scanf getchar
5个回答
12
投票

这是因为scanf使您在输入流中键入换行符。尝试

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

代替

c = getchar();

2
投票

您可以使用fflush函数清除缓冲区中留下的任何内容,这是先前的命令行输入的结果:

fflush(stdin);

2
投票

一种在需要的字符之前清理任何空间,而忽略其余字符的方法是

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

1
投票

[开始时,scanf应该读为scanf("%d\n", &x);或y。这应该可以解决问题。

man scanf


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();
© www.soinside.com 2019 - 2024. All rights reserved.