我使用scanf("%llu%c", &myUnsignedLong, &checkerNewLine)
来验证一个数字>0 && <2^64
,其中checkerNewLine
用于清除缓冲区,如果有人试图插入一个字母(while (getchar() != '\n');
)。
但是如果我尝试插入一个负数,比如-541231
,scanf
成功并返回2(参数的数目匹配)。显然myUnsignedLong
中存储的数字是2^64-541231
,但这不是我的意图。
有什么简单的解决办法吗?谢谢
最佳答案
根据规范(7.9.16.2):u
匹配一个可选的有符号十进制整数,其格式与strtoul函数的主题序列的预期格式相同,其值为10作为基参数。相应的参数应是指向无符号整数的指针。
注意,输入是可选的签名。这解释了代码的行为方式。
但是,我不能提供任何好的解释为什么它是这样规定的。由于不能以定义良好的方式在无符号变量中存储负值,我怀疑这实际上可能会调用未定义的行为。
关于c - 为什么scanf llu不验证%llu?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19477113/