当输入是一个字符时,下面的简单程序会给出无限循环,尽管它意味着从数字中告诉一个字符。如何scanf
使用scanf
的返回值来判断#include <stdio.h>
int main() {
int n;
int return_value = 0;
while (!return_value) {
printf("Input a digit:");
return_value = scanf("%d", &n);
}
printf("Your input is %d\n", n);
return 0;
}
是否应该是一个数字?
{{1}}
答案 0 :(得分:5)
正如Joachim在他的回答中所指出的那样,scanf
这里没有消耗该角色并且生活在缓冲区中,在下一次迭代中scanf
再次读取相同的角色并再次离开到缓冲区等等。这导致无限循环。
您需要在下一次迭代之前使用此字符。只需在getchar()
return_value = scanf("%d", &n);
即可
return_value = scanf("%d", &n);
while(getchar() != '\n'); // will consume the charater
答案 1 :(得分:1)
你得到一个无限循环因为scanf
没有消耗这个字符,所以字符永远不会离开输入缓冲区。
你可以通过阅读一行来解决这个问题。 fgets
然后在该行上使用sscanf
。
答案 2 :(得分:1)
添加第二个(嵌套循环)循环,在您尝试使用另一个scanf读取它之前清除输入缓冲区。
我很长时间没有完成,但它是这样的: #include
int main() {
int n;
int return_value = 0;
while (!return_value) {
printf("Input a digit:");
return_value = scanf("%d", &n);
// this loop will "eat" every character that's left in input buffer
while(getchar() !='\n') {
continue;
}
}
printf("Your input is %d\n", n);
return 0;
}
基本上,任何在失败后清除输入缓冲区的函数/方法都将以相同的方式工作。选择一个你最喜欢的。
答案 3 :(得分:-1)
你应该真正使用TheDubleM的建议并检查buffer
是否为数字,如果是,请使用atoi。在我下面的内容中,您不会将8f8
视为错误输入,而只是阅读8。
#include <stdio.h>
int main() {
int n;
int return_value = 0;
char buffer[1024];
while (!return_value) {
printf("Input a digit:");
scanf("%1024s", buffer);
return_value = sscanf(buffer, "%d", &n);
}
printf("Your input is %d\n", n);
return 0;
}