1

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

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

有什么简单的方法可以解决这个问题吗?非常感谢

4

1 回答 1

4

从规范(7.9.16.2):

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

请注意,输入是可选签名的。这解释了为什么代码的行为如此。

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

于 2013-10-20T12:20:51.637 回答