2014-01-27 54 views
3

我感到困惑与下面的代码scanf()如何工作?

#include <stdio.h> 
    int main(){ 
     int num1, int num2; 
     scanf("%d/%d", &num1, &num2); 
     printf("%d", num2); 
    } 

当输入只有12,为什么我得到32767?

+4

可能是因为num2未初始化,如果你只写了12个。如果我正确读了它,它需要输入格式a/b,其中'a'和'b'都是整数。 – Borgleader

+0

但为什么正好32767? “/”有什么意义? –

+2

/只是格式的一部分。 – Borgleader

回答

10

你不要总是得到32767,因为num2保持未初始化。这里是你如何能告诉我们,如果num2是或不是初始化:

int how_many = scanf("%d/%d", &num1, &num2); 
if (how_many == 0) { 
    printf("Nothing is entered\n"); 
} else if (how_many == 1) { 
    printf("Only num1 is entered: %d\n", num1); 
} else { 
    printf("Both numbers are entered: %d and %d\n", num1, num2); 
} 
+0

thx,但是由于num2保持无效,所以num2中没有存储任何内容,但程序如何仍然有输出? –

+0

@FrankTian它叫做记忆!这就是为什么! – Vallentin

+0

确定内存...这很奇怪.... 32767 –

5

scanf函数试图匹配你给它格式字符串的模式,只要它不能使比赛停止。

scanf("%d/%d", &num1, &num2); 

试图匹配由2个由'/'分隔的整数组成的模式,例如,如果你输入12/22,num1将被设置为12,num2将被设置为22.

如果你只输入12,那么它将匹配格式化字符串中的第一个%d,将num1设置为12. num2不会被感动。由于你的代码不初始化num2,它可能有任何值;它发生在你特定的环境中,它以32767出现;它可以很容易地为0或42或任何其他值。

0

在你的代码中,num 2没有被初始化。这就是为什么它打印出垃圾值。 请尝试下面的代码。

#include <stdio.h> 
    int main(){ 
     int num1, int num2; 
     scanf("%d", &num1); 
     scanf("%d", &num2); 
     printf("%d", num2); 
    }