如this answer中所述:
num
将始终包含整数,因为它是int
。代码的真正问题是您不检查scanf
返回值。scanf
返回成功读取的项目数,因此在这种情况下,它必须返回1以获取有效值。如果不是,则输入一个无效的整数值,并且num
变量可能不会被更改(即,由于您没有初始化它,所以它仍然具有任意值)。根据您的评论,您只希望允许用户输入一个整数,然后按Enter键。不幸的是,
scanf("%d\n")
不能简单地实现这一点,但这是一个技巧:int num; char term; if(scanf("%d%c", &num, &term) != 2 || term != '\n') printf("failure\n"); else printf("valid integer followed by enter key");
我看到这篇文章很好地工作了,但是在do-while循环中不起作用。我需要从用户那里获取直到正确的输入,但是当第一次执行循环时,它会持续打印失败而没有从用户那里获取。
出什么问题了?
答案 0 :(得分:1)
问题是没有从输入缓冲区中清除有问题的字符。如果要清除直到出现错误后的第一个行尾,则必须明确地执行此操作:
int num;
char term;
for (;;) {
if(scanf("%d%c", &num, &term) != 2 || term != '\n') {
printf("failure\n");
int c;
while (('\n' != (c=fgetc(stdin))) && (c != EOF)); // clear up to end of line
if (c == EOF) break; // do not read past EOF...
}
else {
printf("valid integer followed by enter key");
break;
}
}