2010-08-12 47 views
2

可能重複:
confusion in scanf() with & operator行爲的scanf()的

爲什麼我們需要在scanf一個&用於輸入整數,爲什麼不爲字符。 scanf中的&是否在輸入時引用了merory的位置。

例如: -

main() 
{ 
int a; 
char c; 

scanf("%d",&a); 
scanf("%c"c); 
} 
+0

我們需要&字符,但我們不需要字符串(char []或char *) – Andrey 2010-08-12 17:00:25

+2

我們在兩種情況下都需要它。 – 2010-08-12 17:00:33

+0

第二次調用'scanf()'應該是'scanf(「%c」,c)'。 – kiamlaluno 2010-08-12 17:04:30

回答

6

對於每個轉換說明,scanf()預計相應的參數是指向正確的類型:%d預計int *類型的參數,%f預計double *類型,%c%s的參數都期望char *類型的參數,等

%c%s之間的區別在於,前者告訴scanf()讀取單個字符並將它存儲在由對應的參數指定的位置,而LATT er告訴scanf()讀取多個字符,直到它看到0值字符並將所有這些字符存儲在從參數指定的位置開始的緩衝區中。

如果參數尚不是指針類型,則需要在參數上使用&運算符。例如:

int x; 
int *px = some_valid_memory_location_such_as_&x; 
char c; 
char *pc = some_valid_memory_location_such_as_&c; 
... 
scanf("%d", &x); // x is not a pointer type, so we must use the & operator 
scanf("%d", px); // px is a pointer type, so we don't need the & operator 
scanf("%c", &c); // etc. 
scanf("%c", pc); // etc. 

事情變得撲朔迷離正在讀串字符(使用%s轉換說明)的

char buf[SIZE]; 
scanf("%s", buf); // expression 'buf' *implicitly* converted to pointer type 

爲什麼不,我們需要在這種情況下,運營商&?它與C如何處理數組表達式有關。當編譯器看到數組類型的表達式時(例如scanf()調用中的buf),它將隱式地將表達式從N-element array of T轉換爲pointer to T,並將其值設置爲數組中第一個元素的地址。這個值不是左值 - 它不能被賦值(所以你不能寫如buf = foo之類的東西)。唯一的例外是當陣列表達或者是sizeof&運營商的操作數,或者如果數組表達式是一個字符串被用來初始化另一個陣列:

char *p = "This is a test"; // string literal implicitly converted to char *, 
          // string *address* written to p 
char a[] = "This is a test"; // string literal not implicitly converted, 
          // string *contents* copied to a 

總之,表達buf隱含char [SIZE]類型轉換爲char *,所以我們並不需要使用&運營商,實際上表達&buf的類型將是pointer to SIZE-element array of char,或(*)[SIZE],這不是什麼scanf()預計爲%s轉換SPECI費裏。

+0

太棒了!非常感謝..它確實幫助我清除了scanf()的概念。 – 2010-08-13 17:34:48

2

SCANF讀取輸入到存儲器地址a是a所持有的值。 &a是內存中a的位置。

在上面的代碼中,c應該是&c

6

這兩種情況都需要符號符號。 scanf需要指針(你可能想到char *或char [] - 它們本身就是指針)。

1

因爲scanf()需要指針,而&a是指向一個整數的指針。

在你的例子中,你需要在c前面有一個逗號和一個&符號。

int main(void) 
{ 
    int a; 
    char c; 
    char s[21]; 

    scanf("%d",&a); 
    scanf("%c", &c); // Fixed! 
    scanf("%20s", s); 
    printf("a = %d, c = %c, s = <<%s>>\n", a, c, s); 

} 

如果你讀一個字符串,你會傳遞字符串 - 字符指針 - 到scanf()

+0

哇真的幫我...謝謝 – 2010-08-13 17:35:33

0

您需要提供scanf函數與指針,這就是爲什麼你在scanf函數有&( 「%d」,&一); 。 scanf(「%c」c);根本無法工作。

0

你的例子是錯誤的。如果你有一個

char c; 

那麼你需要一個&添加到對罵scanf時:

scanf("%c", &c); 

然而,如果你的變量已經是一個指針,例如,因爲它是一個char[](這是指針的花哨語法),你必須省略&

0

我喜歡將&符號(&)作爲「地址」。所以你會讀&a作爲「地址」。

而且,我想編寫本,但它警告我在GCC:

Warning: format "%c" expects type 'char *', but argument 2 has type 'int' 

這是真的,因爲焦炭基本上是一個int。