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

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

  • 应该认为转换失败了吗?
  • 是所有定义的行为?

从标准7.21.6.2p10( (f)scanf ,适用于全家):

…如果此对象没有适当的types,或者如果转换的结果不能在对象中表示,则行为是未定义的

看起来像是另一个对scanf家族非常谨慎的原因。 strtoXX函数具有完全定义的行为。 他们返回LONG_MAX等太大的input,并设置errno == ERANGE 。 所以如果你需要确切的信息,手动标记input并使用这些函数进行转换。 另一个好处:更好的error handling。