C中奇怪的工作循环

Strange working cycle in C

int n = 0;
int temp = 0;

while ((temp != 1) || (n <= 0)){
  puts("enter array count");
  temp = scanf("%d", &n);
  printf("\n%d\n", temp);
}

我需要检查输入值是否必须是整数并且 > 0。

scanf returns 成功设置值的计数,如果它不是整数,它将 return 0.

所以问题是,当我输入除数字以外的任何字符时,它开始未完成的循环

为什么?

当您为 scanf("%d", &n); 输入无效的内容(例如字符)时,scanf 失败,returns 0,并且 将无效数据保留在stdin。在下一次迭代中 scanf 发现此无效数据在 stdin 中占主导地位,再次失败并重复此过程。

修复方法是在循环的每次迭代中清除 stdin。添加

int c;
while((c = getchar()) != '\n' && c != EOF);

scanf("%*[^\n]");
scanf("%*c");

scanf 之后清除 stdin