爲什麼我們需要在scanf一個&用於輸入整數,爲什麼不爲字符。 scanf中的&是否在輸入時引用了merory的位置。
例如: -
main()
{
int a;
char c;
scanf("%d",&a);
scanf("%c"c);
}
爲什麼我們需要在scanf一個&用於輸入整數,爲什麼不爲字符。 scanf中的&是否在輸入時引用了merory的位置。
例如: -
main()
{
int a;
char c;
scanf("%d",&a);
scanf("%c"c);
}
對於每個轉換說明,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費裏。
太棒了!非常感謝..它確實幫助我清除了scanf()的概念。 – 2010-08-13 17:34:48
SCANF讀取輸入到存儲器地址。 a
是a所持有的值。 &a
是內存中a
的位置。
在上面的代碼中,c
應該是&c
。
這兩種情況都需要符號符號。 scanf需要指針(你可能想到char *或char [] - 它們本身就是指針)。
因爲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()
。
哇真的幫我...謝謝 – 2010-08-13 17:35:33
您需要提供scanf函數與指針,這就是爲什麼你在scanf函數有&( 「%d」,&一); 。 scanf(「%c」c);根本無法工作。
你的例子是錯誤的。如果你有一個
char c;
那麼你需要一個&
添加到對罵scanf
時:
scanf("%c", &c);
然而,如果你的變量已經是一個指針,例如,因爲它是一個char[]
(這是指針的花哨語法),你必須省略&
。
我喜歡將&符號(&)作爲「地址」。所以你會讀&a
作爲「地址」。
而且,我想編寫本,但它警告我在GCC:
Warning: format "%c" expects type 'char *', but argument 2 has type 'int'
這是真的,因爲焦炭基本上是一個int。
我們需要&字符,但我們不需要字符串(char []或char *) – Andrey 2010-08-12 17:00:25
我們在兩種情況下都需要它。 – 2010-08-12 17:00:33
第二次調用'scanf()'應該是'scanf(「%c」,c)'。 – kiamlaluno 2010-08-12 17:04:30