在if语句中使用scanf

时间:2015-06-10 16:35:16

标签: c if-statement output

为什么输出是' 4' ? ,输入是' A'

int main() {  int a = 5;  
if(scanf("%d",&a))  
printf("%d",a+1);  
else  
printf("%d",a-1);  
}

3 个答案:

答案 0 :(得分:2)

当使用类型sepcifier %d时,函数需要输入有效的带符号十进制整数。很明显,符号'A'不是数字,因此输入失败。

现在出现一个问题:在这种情况下函数会返回什么?

根据函数scanf的描述(C标准,7.21.6.4 scanf函数):

  

3如果输入,scanf函数返回宏EOF的值   在第一次转换(如果有)完成之前发生故障。   否则,scanf函数返回输入项的数量   已分配,可以少于提供的,或甚至为零   早期匹配失败的事件

所以if语句中的条件

if(scanf("%d",&a))  

评估为0(false)并执行了else语句。

else  
printf("%d",a-1);  

表示4。

考虑到一般情况下您可以为整数输入符号'A'。但在这种情况下,相应的整数变量必须声明为unsigned,格式说明符scanf必须为%x

例如

#include <stdio.h>

int main( void )
{
    unsigned int a = 5;

    if ( scanf( "%x", &a ) )
    {      
        printf( "%u\n", a + 1 );
    }
    else
    {
        printf( "%u\n", a - 1 );
    }
}

在这种情况下,输出将为11。:) scanf将符号'A'视为10的十六进制表示。

答案 1 :(得分:1)

您已指示scanf读取有符号整数。输入甚至没有以符号或数字开头,因此scanf找不到有符号整数,因此scanf返回0(输入项的数量已成功)匹配和分配),让您进入else的{​​{1}}子句。由于if没有匹配任何内容,因此它没有分配任何内容,这意味着scanf未被更改,aa-1。< / p>

你没有说明你的期望,所以我不知道建议的修正。

答案 2 :(得分:0)

在scanf()中,您传递的所有参数都是指针。指针之间没有默认提升,并且传递与指针类型匹配的确切格式说明符至关重要。

更多清关: - 点击here