读取 ASCII 字符导致无限循环
Reading ASCII character causes an infinite loop
如果您输入整数值,循环工作正常,但如果您输入一些 ASCII 字符或 float
类型值,程序将进入无限循环。这个问题有什么解决办法吗?
从技术上讲,char
是 int
的一种,所以这应该不是问题。
#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
调用失败后仍将保留该值。
如果您输入整数值,循环工作正常,但如果您输入一些 ASCII 字符或 float
类型值,程序将进入无限循环。这个问题有什么解决办法吗?
从技术上讲,char
是 int
的一种,所以这应该不是问题。
#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
调用失败后仍将保留该值。