sscanf("123456789123456789123456789","%d"和&n)是否定义了行为?

chq*_*lie 45 c scanf undefined-behavior

sscanf()scanf族或该族的另一个函数被赋予一个数字序列时,其转换值超过目标整数类型的最大值,

  • 是否应该认为转换失败了?
  • 是根本定义的行为?

too*_*ite 47

从标准来看,7.21.6.2p10((f)scanf适用于整个家庭):

...如果此对象没有合适的类型,或者无法在对象中表示转换结果,则行为未定义.

看起来是与scanf家人非常谨慎的另一个原因.这些strtoXX函数具有完全定义的行为.他们返回LONG_MAX等太大的输入和设置errno == ERANGE.因此,如果您需要确切的信息,请手动标记输入并使用这些函数进行转换.另一个好处:更好的错误处理.

  • 但是,请考虑"除非由*指示赋值抑制,否则转换的结果将放置在格式参数之后的第一个参数所指向的对象中,该参数尚未收到转换结果.如果此对象没有适当的类型,或者如果转换的结果无法在对象中表示,则行为是未定义的." (5认同)
  • @Olaf 7.22.1.4p8"*如果正确的值超出了可表示值的范围[...],则宏"ERANGE"的值存储在"errno".*"中.所以你可以区分.`strtol()`真的是*完全定义*. (5认同)
  • 很好的答案.我在发布问题之前阅读了C11规范,我错过了这个简单的妙语...`scanf()`有很多缺点,并且在很多方面都被误用了,真的应该避免. (4认同)