[英]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中的變量可以具有不同的類型:
與其他語言不同,在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.