我的目标是扫描一些只有正a
,如果输入负数,该函数应该打印错误:
if ( scanf("%u %lf", &a, &b) != 2 ) {
//error
}
现在理论是scanf
返回成功的写作尝试,所以如果我输入一个负数,scanf
不应该返回2.我的理论似乎不正确,为什么?
显然我可以简单scanf
%d
,然后检查%d
是否为否定,但现在我很好奇为什么我的初始理论不正确。那么有没有扫描然后比较的方法呢?
答案 0 :(得分:2)
您的理论不起作用,因为即使在预期无符号数字时输入有符号数字,scanf也不会失败或者不会拒绝将用户输入复制到指定的存储器地址。因此,根据scanf文档,scanf将返回复制到提供的内存地址的项目数。
答案 1 :(得分:2)
我的理论似乎不正确,为什么?
当%u
用作格式设置器时,scanf
需要(来自http://en.cppreference.com/w/cpp/io/c/fscanf):
数字的格式与
strtoul()
预期的格式相同,基本参数的值为10.
strtoul
documentation说这是关于负数的人:
如果减号是输入序列的一部分,则从数字序列计算的数值将被否定,就像结果类型中的一元减号一样,它应用无符号整数环绕规则。
因此即使输入负数,%u
也不会失败。
答案 2 :(得分:0)
scanf()
仍会成功(并递增返回值)。
例如,如果scanf("%u", &my_unsigned_int);
读取文字" -1",则会返回1,而my_unsigned_int
会写为my_unsigned_int = (unsigned int) -1;
如果它们输入一个十进制值,也会出现这种情况 - 它将被赋值给你的int字段,并带有类型转换。它看起来不像你排除浮点数,所以你可能只想scanf("%f", &some_float);
,然后检查some_float
的值。