我编写控制台应用程序,它为 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);
afterscanf
从输入缓冲区中丢弃任何不必要的字符(如 \r \n)scanf
。
编辑:正如评论中提到的fflush
解决方案可能存在可移植性问题,所以这是我的第二个建议。根本不要使用,并使用和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。这应该够了吧。