我编写控制台应用程序,它对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函数清除缓冲区中留下的任何内容,这是先前的命令行输入的结果:
fflush(stdin);
一种在需要的字符之前清理任何空间,而忽略其余字符的方法是
do {
c = getchar();
} while (isspace(c));
while (getchar() != '\n');
[开始时,scanf
应该读为scanf("%d\n", &x);
或y。这应该可以解决问题。
在fflush(stdin);
之后调用scanf
以丢弃输入缓冲区中scanf
留下的任何不必要的字符(如\ r \ n)。
编辑:正如评论中提到的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();