我想知道标准C库函数scanf()在我们调用scanf(“%d”,& var)时,如果输入是整数或字符,当一个字符本身只是一个数字时,该如何检查? 我知道当它遇到一个非整数时,它将它放回到输入缓冲区并返回一个-1,但它怎么知道输入不是一个整数?scanf()如何检查输入是整数还是字符?
回答
你说得对,因为每个字符都被表示为一个8位整数。解决办法很简单:查看该号码,看它是否在48-57范围内,这是字符'0' - '9'的SCII代码范围。
从scanf()
source code的行1315开始,我们可以看到这一行动。 scanf()
实际上更复杂 - 它也会查看多字节字符来确定数值。 1740行是魔法发生的地方,而角色实际上被转换为数字。最后,可能这是最有用的,strtol()
函数执行循环来执行该转换。
它试图从流的开头解析一个有效的十进制整数,实际上是可选的+或 - 然后是一个或多个数字的序列。
你能解释一下它是如何解析的?例如。它将如何区分A和65的值,因为A将以65的形式传递 - 它的ASCII值? – vjain27 2011-04-12 01:47:58
Uh scant尝试在此处读取十进制整数的ASCII表示。字母A不是这样的一部分。 – 2011-04-12 01:54:22
你误会了%d
格式说明。它不是而是返回输入字符的ASCII值(可以使用%c
表示);它返回字符表示的整数。因此,在'9'
的输入字符上,%d
返回值9--而不是'9'
的ASCII值。
(好吧,其实%d
着眼于字符序列,因此,如果输入的是随后'0'
其次' '
'9'
,它会解释,由于90)。
基本上,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
)(我不知道标准库函数会为单个字符值执行此操作)。为什么不从c
减去'0'
以获得等效的整数值?根据编码的不同,不能保证所有的十进制整数字符都会按顺序排列(All The World is Not ASCII);最好将实际转换委托给知道当前编码的函数。
在你提的这是默认控股整数只有那么%d scanf函数声明,它理解该变量作为整数
- 1. 如何检查输入是整数,字符串还是float C++
- 2. 使用scanf验证输入(检查输入是char还是int)
- 3. 如何在JAVA中检查输入是整数还是字符串等?
- 4. 如何检查给定的输入是字符串还是整数?
- 5. 如何检查jasmine.js中的值是整数还是字符串?
- 6. 如何检查foreach索引是整数还是字符串smarty?
- 7. 如何检查scanf后stdin中是否还有一些字符?
- 8. 如何检查输入字符串是否包含整数
- 9. 如何检查输入是整数/字符串?
- 10. 如何检查输入字符串是否为整数
- 11. 如何在Objective-C中检查输入是双字符还是字符串?
- 12. 如何检查输入数字整数是不是浮动?
- 13. 如何检查输入字段的文本是“是”还是“否”?
- 14. 检查一个字符是整数还是字母
- 15. 检查用户输入是浮点还是整数
- 16. 检查字符串是整数还是浮点数
- 17. 在红宝石中键入检查输入密钥是字符还是数字
- 18. PHP检查MySql的输出是数字还是字符串
- 19. 使用stringstream.fail()检查输入是int还是字符串
- 20. 如何检查字段是字符还是数字?
- 21. 如何检查字符是字母还是数字?
- 22. 检查输入是否是整数
- 23. 如何检查输入是日期格式还是整数格式?使用java
- 24. 如果字符作为输入来代替整数,scanf是如何工作的
- 25. 如何检查文本框中输入的文本是字母还是数字
- 26. 如何检查单个字符串输入的部分是int还是char?
- 27. 检查输入是数字还是句点
- 28. 检查输入值是整数,命令,还是只是坏数据(Python)
- 29. 如何检查JSON数据是对象还是字符串?
- 30. 程序如何检测字符串是数字还是字符?
感谢您对源代码的解释和参考! – vjain27 2011-04-12 03:09:28