首页 > 解决方案 > 为什么即使输入大于给定的数字类型,scanf 也会返回正值?

问题描述

给定以下代码:

int x;
int r = scanf("%d", &x);

1当用户输入大于INT_MAX甚至大于的数字时,为什么 scanf 会返回LONG_MAX

文档中:

Number of receiving arguments successfully assigned.

为什么x认为分配成功?在这种情况下,它究竟意味着什么?当用户给出 和 之间的数字时INT_MAXLONG_MAX似乎x是结果的下半部分。我知道内部scanf使用strtol,但scanf可以确定类型int太小而无法包含结果。此外,当传递一个大于 的巨大数字时LONG_MAX,它的值x-1并且返回值仍然 1是,我必须依靠errno来检查是否出现问题(errno == ERANGE)。

“成功分配”是什么意思,为什么scanf返回1,因为它可以很容易地判断结果实际上是垃圾?

标签: c

解决方案


为什么当用户输入大于 INT_MAX 甚至大于 LONG_MAX 的数字时,scanf 返回 1?

当输入文本转换为超出范围时,这是未定义行为(UB) 。这是一个规范的弱点。 任何事情都可能发生。int"%d"scanf()

健壮的代码将输入与转换分开。看fgets()strtol()


推荐阅读