scanf()行为不端

我有一个非常短的片段,读取整数:

#include  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); } } } 

但问题是,如果我输入任何字母,它只是循环并打印出“找不到号码”而不是等待下一个输入。

我究竟做错了什么?

使用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); } } 

希望这可以帮助!

听起来好像你没有清除输入缓冲区并且不正确的字符被反复扫描。
看这里:
Scanf和循环

scanf没有终止

手册页说

返回值这些函数返回分配的输入项数。 在匹配失败的情况下,这可以少于提供的甚至为零。 零表示虽然有可用的输入,但没有分配转换; 通常这是由于输入字符无效,例如’%d’转换的字母字符。

由于您使用了“%d”,如果您使用任何数字,那么这将正常工作,否则它将不会从缓冲区中消耗它