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

时间:2017-06-24 19:58:27

标签: c scanf undefined-behavior

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

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

1 个答案:

答案 0 :(得分:47)

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

  

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

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