读取 ASCII 字符导致无限循环

Reading ASCII character causes an infinite loop

如果您输入整数值,循环工作正常,但如果您输入一些 ASCII 字符或 float 类型值,程序将进入无限循环。这个问题有什么解决办法吗? 从技术上讲,charint 的一种,所以这应该不是问题。

#include <stdio.h>

int main(void)
{
  int num;

  scanf("%d",&num);
  while (num < 40)
  {
    printf("Number is small\n");
    scanf("%d",&num);
  }
  return 0;
}

函数scanf will try to read a decimal integer from stdin. It uses the definition of a decimal integer from strtol:

The valid integer value consists of the following parts:

  • (可选)加号或减号
  • (可选)前缀(0)表示八进制基数(仅适用于基数为8或 0 的情况)
  • (可选)前缀(0x或0X)表示十六进制基数(仅适用于基数为16或 0 的情况)
  • 一串数字

换句话说,scanf 将尝试 上的字符序列stdin 解释为十进制整数。它不会根据 ASCII table.

进行字符到整数的转换

您的问题的解决方案在于检查 scanf 的 return 值,即:

Number of receiving arguments successfully assigned (which may be zero in case a matching failure occurred before the first receiving argument was assigned), or EOF if input failure occurs before the first receiving argument was assigned.

所以,检查scanf是否没有return 1.这种情况下,它没有读到一个十进制整数,num没有被赋值,不应该用过。
在给定的程序中,如果 num 从未被赋值,那么它的值是不确定的。这可能是一个 <40 的值,将无限循环解释为 scanf 反复尝试从 stdin 读取非整数,失败并在 stdin 上保留非整数。如果 num 之前已被赋值,它在 scanf 调用失败后仍将保留该值。