我有一个非常短的片段,读取整数:
#include <stdio.h>
int main() {
while (1) {
int i = 0;
int r = scanf("%d", &i);
if (r == EOF) {
printf("Error using scanf()\n");
} else if (r == 0) {
printf("No number found\n");
} else {
printf("The number you typed in was %d\n", i);
}
}
}
但问题是,如果我输入任何字母,它只是循环并打印出“找不到号码”而不是等待下一个输入。
我做错了什么?
答案 0 :(得分:2)
使用scanf
时,如果您尝试执行读取操作并且找到的数据与预期格式不匹配,则scanf
会留下未知数据,以供将来的读取操作使用。在这种情况下,正在发生的是您尝试从用户读取格式化数据,用户的数据与您预期的格式不匹配,因此无法读取任何内容。然后它循环尝试再次读取并找到之前相同的违规输入,然后再次循环,等等。
要解决这个问题,你只需要消耗那些搞砸了输入的字符。一种方法是调用fgetc
来读取字符,直到检测到换行符,这将刷新任何有问题的字符:
while (1) {
int i = 0;
int r = scanf("%d", &i);
if (r == EOF) {
printf("Error using scanf()\n");
} else if (r == 0) {
printf("No number found\n");
/* Consume bad input. */
while (fgetc(stdin) != '\n')
;
} else {
printf("The number you typed in was %d\n", i);
}
}
希望这有帮助!
答案 1 :(得分:1)
听起来你没有清除输入缓冲区并且不断地扫描不正确的字符
见这里:
Scanf and loops
和
scanf not terminating
答案 2 :(得分:0)
手册页说
返回值 这些函数返回分配的输入项数。这可能比提供的少,甚至为零 匹配失败的事件。 零表示虽然有可用输入,但没有分配转换; typ- 这是由于输入字符无效,例如'%d'转换的字母字符。
由于您使用了“%d”,如果您使用任何数字,那么这将正常工作,否则它将不会从缓冲区消耗它