簡體   English   中英

C中的scanf()中的格式說明符?

[英]format specifiers in scanf( ) in C?

為什么我們將格式說明符傳遞給C中的scanf()作為其參數?

我的意思是,我們不能做

scanf( &var ); // Here, var is any pre-declared variable.

可以從其聲明中獲取var的類型。 為什么不允許這樣做?

我認為以下代碼浪費了內存。

scanf( "%d" , &var );

該類型不能“從其聲明中獲取”。 scanf()並不神奇,它只是一個函數。 C語言中的函數無法訪問有關變量的元信息。

這就是為什么通常聲明函數自變量包括其類型的原因。 對於諸如scanf()可變參數函數,第一個參數不是可選的,它用於以函數本身選擇的某種方式描述其他參數的數量和類型。

您顯然需要閱讀一些有關C編程的書,以更好地理解核心概念。 與其他一些語言不同,C語言沒有將I / O機制引入該語言。 scanf()只是一個庫函數,因此,該函數無法自動知道應該填充的變量的類型。

因為%d只會指定var的類型,所以不會浪費內存。 scanf(&var)無法正常工作,因為該函數並非旨在以這種方式接受參數。

您知道C中的變量可以具有不同的類型:

  • int:整數
  • char:字符
  • float:浮點數。
  • ...

與其他語言不同,在C語言中不能在編譯時隱式地推斷變量類型。這就是為什么總是聲明變量類型的原因(示例:int a或char c)。

因為scanf只是C語言中的一個函數,並且因為C語言中的函數應采用特定類型的參數,所以對C語言進行編碼的人員決定使用以下格式:

     scanf("%d", &var) ; // for integers
     scanf("%c", &var); //for chars
     scanf("%f", &var); //for double and floats.

使用%d或%c不會浪費內存或其他任何資源。 您可以將其視為指定輸入變量類型的標志。

C的開發人員可以在沒有%d,%c ... etc的情況下做到嗎? 是的,他們可以,但是然后,他們必須處理由於發送錯誤的類型而引起的所有可能的異常。

假設C的開發人員僅使用以下格式

    scanf(&var);

這非常簡潔,但是隨后您將必須使用相同的語法來發送chars / int / double ... etc,然后函數scanf必須找出一種方法來確定所發送變量的類型。 還記得我以前說過的話嗎? 不能在編譯時隱式地推斷變量類型,因此,該任務幾乎是不可能的。

但是,他們可以為每種類型使用不同的scanf函數。 例如:

    scanfInt(&var);     //for integers.
    scanfFloat(&var);   //for floats.
    ...
    ...

那會完美地工作,但是復制相同的scanf代碼並使用不同的功能(因為類型不同)就沒有多大意義了。

那么解決方案是什么? ==>使用相同的函數名稱(scanf),然后添加參數(%d,%f,%c ..),C會在內部將其用作標志以了解參數類型。

我希望您現在對%d,%f的用法有了更好的了解。

您在這里缺少兩個要點。

首先,我們坐在鍵盤旁的人會寫類似以下內容:

char var = '0';

而且我們知道此變量的“類型”是char ,我們可能打算在其中存儲一個字符。 一旦編譯器掌握了這一點,它將刪除這些“人為”元素,所有剩下的都是保留在某個內存位置,保留了1個字節,對我們編寫“ var”的代碼位置的進一步引用將與此內存位置進行交互。 那是編譯器所知道的,對預期的變量“類型”沒有任何了解。

其次,格式規范者所做的不僅僅只是指示簡單的類型。 查看任何解釋scanf()頁面,您會看到一個長長的列表,特別注意諸如掃描集,否定掃描集和預期輸入長度之類的內容。

假設我希望用戶只輸入一個數字0-9,那么我不必只是假設他們會按照我的要求做,我可以通過使用scanf()中的格式說明符來幫助確保他們將:

int var = 0;
print("enter 1 digit (0-9):\n");
scanf("%1d", &var);

現在,無論輸入多少位,我都只會存儲第一個數字。

如果您有一個要從用戶中讀取的字符串,並且想一直讀取所有內容,直到遇到新的換行符(讀取空格),該怎么辦。 我們將為此提供多種選擇,但是scanf也可以做到這一點。 讀取字符串的“標准”是:

scanf("%s",some_string);

但這將停止在任何空格字符處,因此在這種情況下,您不希望scanf()做出假設,您希望能夠使用特定的否定掃描集:

scanf("%[^\n]",some_string);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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