我想知道当字符本身只是一个数字时,标准C库函数scanf()检查输入是整数还是字符时我们调用scanf(“%d”,& var)? 我知道当它遇到一个非整数时,它会把它放回输入缓冲区并返回-1但是它怎么知道输入不是一个整数?
答案 0 :(得分:3)
输入始终是一个字符串。如果scanf
期望一个整数(因为你传递了它"%d"
),它会尝试将字符串转换为整数。
答案 1 :(得分:3)
你是正确的,因为每个字符实际上都表示为一个8位整数。解决方案很简单:查看该数字,看看它是否在48-57范围内,这是字符'0' - '9'的SCII代码范围。
从scanf()
source code的第1315行开始,我们可以看到这一点。 scanf()
实际上更复杂 - 它还会查看多字节字符以确定数值。第1740行是神奇发生的地方,该角色实际上被转换为数字。最后,可能这是最有用的,strtol()
函数执行循环来执行转换。
答案 2 :(得分:2)
在scanf语句中,你提到%d只保存整数,所以默认情况下它将变量理解为整数
答案 3 :(得分:1)
基本上,scanf
函数根据您传递的转换说明符匹配正则表达式。如果您指定%d
,则会告诉scanf
将输入与正则表达式匹配,该正则表达式是'0'
和'9'
之间的一个或多个字符(可选地带有前导+
或-
字符。然后它将该字符序列转换为等效的整数值。
非常简单版本可能如下所示:
while (isdigit(c = fgetc(stream))
val = val * 10 + valueOf(c);
ungetc(c, stream);
其中isdigit
是标准库函数,如果字符值表示十进制数字,则返回true(非零),valueOf
是用户定义的函数,用于映射表示整数的字符('0'
- '9'
)到等效整数值(0
- 9
)(我不知道为单个字符值执行此操作的标准库函数) 。为什么不从'0'
中减去c
来获得等效的整数值?根据编码,不能保证所有十进制整数字符按顺序排列(全世界不是ASCII);最好将实际转换委托给知道当前编码的函数。
答案 4 :(得分:0)
它尝试从流的开头解析有效的十进制整数,实际上是可选的+或 - 然后是一个或多个数字的序列。
答案 5 :(得分:0)
它基本上使用了一个循环:
while (isdigit((ch=getchar()))
// ...
答案 6 :(得分:0)
您误解了%d
格式说明符。它不返回输入字符的ASCII值(您可以使用%c
);它返回字符表示的整数。因此,对于'9'
的输入字符,%d
返回值9 - 而不是'9'
的ASCII值。
(好吧,%d
实际上会查看一系列字符,因此如果输入为'9'
后跟'0'
后跟' '
,则会将其解释为90)。