如樣例代碼printf("BMI = %f\n", 21.3),其中%f就是一個佔位符。printf()函數的佔位符有許多種類,與c語言的數據類型相對應。以下列舉一些常見的。
| 佔位符 | 含義 |
|---|---|
| %a | 十六進制浮點數,字母輸出為小寫。 |
| %A | 十六進制浮點數,字母輸出為大寫。 |
| %c | 字符。//char |
| %d | 十進制整數。// int |
| %e | 使用科學計數法的浮點數,指數部分的e為小寫。 |
| %E | 使用科學計數法的浮點數,指數部分的E為大寫。 |
| %i | 整數,基本等同於%d。 |
| %f | 小數(包含float類型和double類型)。//float %f double %lf |
| %g | 6個有效數字的浮點數。整數部分一旦超過6位,就會自動轉為科學計數法,指數部分的e為小寫。 |
| %G | 等同於%g,唯一的區別是指數部分的E為大寫。 |
| %hd | 十進制 short int 類型。 |
| %ho | 八進制 short int類型。 |
| %hx | 十六進制 short int類型。 |
| %hu | unsigned short int 類型。 |
| %ld | 十進制 long int 類型。 |
| %lo | 八進制long int 類型。 |
| %lx | 十六進制 long int 類型。 |
| %lu | unsigned long int 類型。 |
| %lld | 十進制long long int 類型。 |
| %llo | 八進制 long long int類型。 |
| %llx | 十六進制 long long int類型。 |
| %llu | unsigned long long int 類型。 |
| %Le | 科學計數法表示的long double類型浮點數。 |
| %Lf | long double類型浮點數。 |
| %n | 已輸出的字符串數量。該佔位符本身不輸出,只將值存儲在指定變量之中。 |
| %o | 八進制整數。 |
| %p | 指針(用來打印地址)。 |
| %s | 字符串。 |
| %u | 無符號整數(unsigned int)。 |
| %x | 十六進制整數。 |
| %zd | size_t類型。//sizeof操作符的返回值類型 |
| %% | 輸出一個百分號。 |
scanf()常用的佔位符如下,與printf()的佔位符基本一致。
| 佔位符 | 含義 |
|---|---|
| %c | 字符。 |
| %d | 整數。 |
| %f | float類型浮點數。 |
| %lf | double類型浮點數。 |
| %Lf | long double類型浮點數。 |
| %s | 字符串。 |
| %[] | 在方括號中指定一組匹配的字符(比如%[0-9]),遇到不在集合之中的字符,匹配將會停止。 |
值得注意的是,上面所有佔位符之中,除了%c以外,都會自動忽略起首的空白字符。%c不忽略空白字符,總是返回當前第一個字符,無論該字符是否為空格。
如果要強制跳過字符前的空白字符,可以寫成scanf(" %c",&ch),即%c前加上一個空格,表示跳過零個或多個空白字符。
下面要特別説一下佔位符%s ,它其實不能簡單地等同於字符串。它的規則是,從當前第一個非空白字符開始讀起,直到遇到空白字符(即空格、換行符、製表符等)為止。
因為%s不會包含空白字符,所以無法用來讀取多個單詞,除非多個%s一起使用。這也意味着,scanf()不適合讀取可能包含空格的字符串,比如書名或歌曲名。另外,scanf()遇到%s佔位符,會在字符串變量末尾存儲一個空字符\0。
scanf()將字符串讀入字符數組時,不會檢測字符串是否超過了數組長度。所以,儲存字符串時, 很可能會超過數組的邊界,導致預想不到的結果。為了防止這種情況,使用%s佔位符時,應該指定讀入字符串的最長長度,即寫成%[m]s ,其中的[m]是一個整數,表示讀取字符串的最大長度,後面的字符將被丟棄。
#include <stdio.h>
int main()
{
char name[11];
scanf("%10s", name);
return 0;
}
上面示例中,name是一個長度為11的字符數組,scanf()的佔位符%10s表示最多讀取用户輸入的10個字符,後面的字符將被丟棄,這樣就不會有數組溢出的風險了。