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);afterscanf从输入缓冲区中丢弃任何不必要的字符(如 \r \n)scanf

编辑:正如评论中提到的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();
于 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。这应该够了吧。

人扫描

于 2012-01-13T15:47:27.903 回答