我编写控制台应用程序,为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
如何解决这个问题?
答案 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。这应该可以解决问题。
答案 4 :(得分:1)
在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();