簡體   English   中英

你如何使用scanf在C中獲取int?

[英]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); &favNumberint *%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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM