c - 为什么即使输入大于给定的数字类型,scanf 也会返回正值?
问题描述
给定以下代码:
int x;
int r = scanf("%d", &x);
1
当用户输入大于INT_MAX
甚至大于的数字时,为什么 scanf 会返回LONG_MAX
?
从文档中:
Number of receiving arguments successfully assigned.
为什么x
认为分配成功?在这种情况下,它究竟意味着什么?当用户给出 和 之间的数字时INT_MAX
,LONG_MAX
似乎x
是结果的下半部分。我知道内部scanf
使用strtol
,但scanf
可以确定类型int
太小而无法包含结果。此外,当传递一个大于 的巨大数字时LONG_MAX
,它的值x
是-1
并且返回值仍然 1
是,我必须依靠errno
来检查是否出现问题(errno == ERANGE
)。
“成功分配”是什么意思,为什么scanf
返回1
,因为它可以很容易地判断结果实际上是垃圾?
解决方案
为什么当用户输入大于 INT_MAX 甚至大于 LONG_MAX 的数字时,scanf 返回 1?
当输入文本转换为超出范围时,这是未定义行为(UB) 。这是一个规范的弱点。
任何事情都可能发生。int
"%d"
scanf()
健壮的代码将输入与转换分开。看fgets()
和strtol()
。
推荐阅读
- java - 树集的内部工作或HashSet和TreeSet的区别
- json - JSON反序列化列表列表
- image-processing - 是否可以在不调整大小的情况下将卷积神经网络应用于图像分类?
- python - 从 excel 表中读取并将确切的字符写入 json 文件
- html - 将 JSON 数据与数组、TypeScript (Ionic 3) 结合
- shell - 与多搜索匹配后的 AWK 打印
- selenium - Selenium Webdriver-如何单击网页中的“登录”按钮
- java - java - 使用 IgniteFuture 进行单元测试
- javascript - 来自 localStorage url 的图像返回 [object ArrayBuffer]
- php - 对日期时间字段运行选择查询时出错