使用scanf过滤掉负数

时间:2016-12-15 02:26:56

标签: c++ scanf unsigned

我的目标是扫描一些只有正a,如果输入负数,该函数应该打印错误:

if ( scanf("%u %lf", &a, &b) != 2 ) {
    //error
}

现在理论是scanf返回成功的写作尝试,所以如果我输入一个负数,scanf不应该返回2.我的理论似乎不正确,为什么?

显然我可以简单scanf %d,然后检查%d是否为否定,但现在我很好奇为什么我的初始理论不正确。那么有没有扫描然后比较的方法呢?

3 个答案:

答案 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的值。