[英]How do you use scanf to get an int in C?
我正在嘗試從控制台獲取輸入的不同方法的優點和缺點。 我和scanf
很困惑。 為什么我需要使用use &favNumber
而不是favNumber
?
據我所知, &favNumber
是的地址位置favNumber
,但它為什么做這樣?
我覺得這里的類型不匹配, favNumber
是一個int,我告訴scanf
它是一個指向int的指針。 我以為我把頭包裹在指針附近,但這讓我感到困惑。 任何幫助,將不勝感激。 謝謝!
#include <stdio.h>
int main()
{
char userPrompt[100] = "What is your favorite number?";
int favNumber;
printf("%s", userPrompt);
scanf("%d", &favNumber);
printf("%d", favNumber);
return 0;
}
當您通過值調用函數時,該函數將獲取參數的副本。 函數中對參數的任何更改都不會影響原始變量的值。
void foo(int i )
{
i = 20; // The change is local to the function.
}
void bar()
{
int i = 10;
foo(i);
printf("i=%d\n", i); // i is still 10.
}
如果希望函數更改變量的值,則函數必須使用指針類型,並且調用函數時調用函數必須使用變量的地址。
void foo(int* i )
{
*i = 20; // The change is visible in the calling function
}
void bar()
{
int i = 10;
foo(&i);
printf("i=%d\n", i); // i is now 20.
}
這就是為什么scanf
需要指針,調用函數在調用scanf
時必須使用變量的地址。 scanf
必須能夠設置變量的值。
&
符號用於通過其內存地址引用值。 因此,當傳遞引用時,使用該引用會修改引用所在地址的值。
scanf
基本上只是一個函數,如果您熟悉函數,您將看到按值傳遞給函數的參數將是函數的本地參數,並且對它的任何賦值都只會更改函數內的值(它不會回答需要將“掃描”值存儲在傳遞的變量中)。 在scanf
情況下,它接受一個引用(換句話說,該值的內存中的位置),因此它可以修改該位置的值,並且“scaned”值可以存儲在感興趣的變量中。
所以把它包起來什么&favNumber
不會被傳遞給scanf
的內存地址favNumber
變量,它在它的自我是一個int
,這樣的int
值寫入到該地址,可以通過訪問favNumber
。
“你如何使用scanf在C中獲取int?”
- 你沒有。 你使用更健全的方法(例如fgets()
+ strtol()
),因為scanf()
是古怪而笨拙並且難以正確使用。
但是,你的問題顯然與此無關; 你在問為什么要寫scanf("%d", &favNumber);
當&favNumber
是int *
但%d
指定int
。
好吧,您似乎將類型安全/類型不匹配與庫函數所期望的任意類型表示混淆。
&favNumber
確實是 int的指針。 然而, %d
說明符並不意味着“你必須通過int
對於這種說法”。 %d
是庫定義的表示法,它告訴scanf()
掃描一個整數,並將其放入下一個參數中。 為了使scanf()
能夠修改你的參數,你需要傳遞一個指向它的指針,實際上這個函數需要你傳遞一個指向它的指針。
我可以這樣說: "%d"
只是意味着與printf()
和scanf()
一起使用時有所不同:在前一種情況下,它意味着你傳遞一個int
參數,在后一種情況下,它意味着你應該傳遞一個int *
。
同樣,情況也是如此,因為這些格式字符串沒有固有的語義。 它是解釋它們的格式化輸入/輸出函數 - 在這種情況下,出於技術必要性原因,它們會不同地解釋格式字符串。
好吧,所以我認為你的困惑是因為'&'表示地址,而不是指向地址的指針,因為'*'表示地址本身。 您將告訴掃描功能它將存儲從用戶接收的值。 如果您要引用變量本身即'favNumber',您如何知道存儲在stdin中的值的位置? favNumber只是一個容器,它沒有什么特別的,只是內存中的一個位置,用於保存所述字節數。 我覺得好像我明白你的問題來自哪里,但如果你已經遇到過指針,我想你可能會混淆兩者。 指針指向內存中的地址,'&'表示實際地址,並且大致指示指針將執行的操作,但指向非指針變量。 如果favNumber是'int *'類型,那么你就不需要&符號,因為它已經是一個地址,但是你需要取消引用該地址才能分辨它內部的內容。 這大致是你在favNumber中所擁有的,這是一個解除引用的地址指針,它顯示存儲在favNumber地址中的內容,該地址是在運行的程序開始時在堆棧中分配的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.