我正在使用scanf("%llu%c", &myUnsignedLong, &checkerNewLine)
来验证数字>0 && <2^64
,如果有人尝试插入字母checkerNewLine
,则使用while (getchar() != '\n');
清除缓冲区。< / p>
但是,如果我尝试插入负数,例如-541231
,scanf
成功并返回2(作为匹配的参数数量)。显然myUnsignedLong
中存储的数字是2^64-541231
,但这不是我的意图。
任何解决这个问题的简单方法?非常感谢
答案 0 :(得分:4)
根据规范(7.9.16.2):
u
匹配可选的带符号十进制整数,其格式与strtoul函数的主题序列的预期格式相同,基本参数的值为10。相应的参数应该是指向无符号整数的指针。
请注意,输入可选择签名。这解释了代码行为的原因。
但是我不能提供任何好的解释,说明为什么用这种方式指定。由于您无法以明确定义的方式将负值存储在无符号变量中,因此我怀疑这实际上可能会调用未定义的行为。