为什么scanf llu不验证%llu?

时间:2013-10-20 12:04:48

标签: c validation scanf

我正在使用scanf("%llu%c", &myUnsignedLong, &checkerNewLine)来验证数字>0 && <2^64,如果有人尝试插入字母checkerNewLine,则使用while (getchar() != '\n');清除缓冲区。< / p>

但是,如果我尝试插入负数,例如-541231scanf成功并返回2(作为匹配的参数数量)。显然myUnsignedLong中存储的数字是2^64-541231,但这不是我的意图。

任何解决这个问题的简单方法?非常感谢

1 个答案:

答案 0 :(得分:4)

根据规范(7.9.16.2):

  

u 匹配可选的带符号十进制整数,其格式与strtoul函数的主题序列的预期格式相同,基本参数的值为10。相应的参数应该是指向无符号整数的指针。

请注意,输入可选择签名。这解释了代码行为的原因。

但是我不能提供任何好的解释,说明为什么用这种方式指定。由于您无法以明确定义的方式将负值存储在无符号变量中,因此我怀疑这实际上可能会调用未定义的行为。