scanf()如何检查输入是整数还是字符?

时间:2011-04-12 01:38:29

标签: c scanf

我想知道当字符本身只是一个数字时,标准C库函数scanf()检查输入是整数还是字符时我们调用scanf(“%d”,& var)? 我知道当它遇到一个非整数时,它会把它放回输入缓冲区并返回-1但是它怎么知道输入不是一个整数?

7 个答案:

答案 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)。