sscanf(“123456789123456789123456789”,“%d”,&n)是否定义了行为?
当sscanf()
或scanf
系列的另一个函数被赋予一个转换值超过目标整数types最大值的数字序列时,
- 应该认为转换失败了吗?
- 是所有定义的行为?
从标准7.21.6.2p10( (f)scanf
,适用于全家):
…如果此对象没有适当的types,或者如果转换的结果不能在对象中表示,则行为是未定义的 。
看起来像是另一个对scanf
家族非常谨慎的原因。 strtoXX
函数具有完全定义的行为。 他们返回LONG_MAX
等太大的input,并设置errno == ERANGE
。 所以如果你需要确切的信息,手动标记input并使用这些函数进行转换。 另一个好处:更好的error handling。