2014-01-27 92 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); 
    }