2013-11-02 83 views
2

爲什麼&在此之前使用decksscanf("%i", &decks))?爲什麼在變量之前使用&?

如果我的輸入是像'k'這樣的任何字母,那麼它顯示的輸出如「1929597720」。爲什麼?

#include <stdio.h> 

int main(){ 
    int decks; 

    puts("enter a number of decks:"); 
    scanf("%i", &decks); 

    if (decks<1) {puts("Please enter a valid deck number"); 
     return 1; 
    } 

    printf("there are %i cards\n", (decks*52)); 
    return 0; 
} 

回答

3

&變量名前的意思是「使用此變量的地址」。基本上,你傳遞一個指針decksscanf()

至於當你輸入「K」發生了什麼(或其他無效輸入) - scanf()失敗,和你看到的任何隨機數據已經在decks(從未初始化)。

要避免這種情況,請檢查返回值scanf(),並初始化decks

int decks = 0, scanned; 

puts("enter a number of decks:"); 
int scanned = scanf("%i", &decks); 

if ((decks<1) || (scanned < 1)) { 
    puts("Please enter a valid deck number"); 
    return 1; 
} 
0

當傳遞東西的scanf(),您需要在指針傳遞給變量,而不是變量本身。 &的意思是「不要拿這個變量,把這個變量存儲在內存中的地方。」這有點複雜,但是有必要讓C可以改變變量的值。
此外,您的格式字符串更改爲

scanf("%d", &decks); 

垃圾是因爲你不初始化甲板。如果你輸入int decks = 0,你總是會得到0.

+0

唔,'%i'很好;它可以用來閱讀像'0xabcd'這樣的東西。 –

1

由於每個優秀的C教程都會教你,&符號用於獲取變量的地址。

scanf()的情況下,爲了告訴scanf()要把數據放在哪裏,這是必要的。


如果你輸入像k,或任何非數字字母,scanf()將由受到干擾,如果你會檢查scanf()的返回值,它會告訴你,0項被讀取,而不是1.

在這種情況下,給定變量的內容不變,並且包含隨機垃圾。這也是你輸出的內容。

+0

我正在閱讀頭文件到C電子書。你可以參考我的一些好書,更基本的東西..我非常喜歡「得到一個地址的變量」 –

+0

我想他實際上是指「得到一個變量的地址」 –

+1

_As每本好書都會教你,&符號是爲了得到一個變量的地址._從來沒有看到***在尋找紅色十月***。 (忍不住) – ryyker

相關問題