有没有我用C语言签名的号码错过了什么?

时间:2015-01-05 01:57:42

标签: c scanf

这是我的基本C测试程序。 在我构建它之后,我在控制台中输入了负数-1-2等。 但结果是"哦"而不是"另一个数字"。 我不知道为什么会发生这种情况,因为负面的数字应该会导致“如果'声明是真的。

int main(int argc, char* argv[]){
    long int num;

    scanf("%d", &num);

    if(num ==1 || num < 0){
        printf("another number\n");
    }else{
        printf("oh\n");
    }
}

3 个答案:

答案 0 :(得分:2)

%ld变量使用long%d使用int。将您的代码更改为以下其中一个:

int num;
scanf("%d", &num);

long int num;
scanf("%ld", &num);

答案 1 :(得分:2)

%d格式字符串与scanf一起使用时,相应的参数将被视为int*。但是你通过了long int*。值scanf存储的大小与if语句读取的大小不同。

正式地,您会得到未定义的行为。在实践中,在大多数平台上scanf只会写入变量的一部分,其余的将留下任意值,通常会对将来的使用造成不良影响。

答案 2 :(得分:1)

/tmp$ gcc -Wall foo.c
foo.c: In function ‘main’:
foo.c:4:5: warning: implicit declaration of function ‘scanf’ [-Wimplicit-function-declaration]
foo.c:4:5: warning: incompatible implicit declaration of built-in function ‘scanf’ [enabled by default]
foo.c:4:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘long int *’ [-Wformat]
foo.c:7:9: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
foo.c:7:9: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
foo.c:9:9: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
foo.c:11:1: warning: control reaches end of non-void function [-Wreturn-type]

修正这些警告的原因,所有的错误都会消失。