1.scanf()輸入控制符
1.1 轉換說明符
| 轉換說明符 | 意 義 |
| %c | 把輸入解釋成一個字符 |
| %d | 把輸入解釋成一個有符號十進制整數 |
| %e,%f,%g,%a | 把輸入解釋成一個浮點數(%a 是C99標准) |
| %E,%F,%G,%A | 把輸入解釋成一個浮點數(%A是C99標准) |
| %i | 把輸入解釋成一個有符號十進制整數 |
| %o | 把輸入解釋成一個有符號八進制整數 |
| %p | 把輸入解釋成一個指針(一個地址) |
| %s | 把輸入解釋成一個字符串:輸入的內容是以第一個非空白字符作為開始, 並且包含直到下一個空白字符的全部字符 |
| %u | 把輸入解釋成一個無符號十進制整數 |
| %x,%X | 把輸入解釋成一個有符號十六進制整數 |
1.2 轉換修飾符
| 修飾符 | 意 義 |
| * | 滯后賦值 示例:“%*d” |
| digit(s) | 最大字段寬度:在達到最大字段寬度或者遇到第一個空白字符時(不管哪個先發生都一樣) 停止對輸入項的讀取 示例:"%10s" |
| hh | 把整數讀作signed char 或者 unsigned char 示例:"%hhd” “%hhu” |
| ll | 把整數讀作long long或者 unsigned long long (C99) 示例: "%lld” "%llu" |
| h,l或L | "%hd"和"%hi" 指示該值將會存儲在一個short int 中。"%ho”、"%hx”和"%hu”指示該值將會存 儲在一個unsigned short int 中。"%ld” 和 "%li“ 指示該值將會存儲在一個 long 中。 "%lo"、"%lx" 和"%lu"指示該值將會存儲在一個 unsigned long 中。 "%le"、"%lf" 和 "%lg" 指示該值以double類型 存儲。將L(而非l)與e、f 和 g 一起指示該值以 long double 類型存儲。 如果沒有這些修飾符, d、 i、 o 和 x 指示 int 類型,而e、f 和 g 指示 float 類型 |
2.scanf()的返回值
scanf()函數返回成功讀入的項目的個數。如果沒有讀取任何項目(如它期望一個數字但是出入了一個非數字字符),它會返回值0。當它檢測到“文件結尾”時,它返回EOF(EOF是文件stdio.h中定義的特殊值。一般,#define 指令把EOF 的值定義為 -1)。
3.用%c讀入空格與字符的問題
如果在格式字符串中%c之前有一個空格,那么scanf()會跳到第一個非空白字符處。也就是說,命令scanf(“%c”,&ch)讀取在輸入中遇到的第一個字符,而scanf(“ %c”,&ch)(%c前有個空格)則讀取遇到的第一個非空白字符。
對於同時輸入幾個字符,如果逗號(或任何非空格字符)和第一個%c之間沒有間隔,則輸入時,第一個字符與逗號之間也不能有間隔;如果有空格,則輸入時,第一個字符和逗號之間可以有任意多個字符,也可以是0個。如果逗號和第二個%c之間沒有間隔,則逗號和第二個輸入字符間也不能有間隔。如果有空格,則輸入時,第二個字符和逗號之間可以有任意多個字符,也可以是0個。
1 #include <stdio.h> 2 3 int main(void) 4 { 5 char ch1, ch2; 6 int i; 7 8 scanf("%c,%c", &ch1, &ch2); 9 printf("%c,%c\n", ch1, ch2); 10 11 scanf(" %c , %c", &ch1, &ch2); 12 printf("%c,%c\n", ch1, ch2); 13 14 scanf(" %d", &i); 15 printf("i = %d\n", i); 16 17 return 0; 18 }
在Vc++6.0中的輸出結果為:

4.printf()函數的*修飾符
假定不想事先制定字段寬度,而是希望由程序來指定該值,可以在字段寬度部分使用*來代替數字來達到目的,但是也必須使用一個參數來告訴函數字段寬度應該是什么。也就是說,如果轉換說明符是%*d ,那么參數列表中應該包括一個 * 值和一個 d 的值。同時這種方式也可以和浮點數一起使用來指定精度和字段寬度。
1 #include <stdio.h> 2 3 int main(void) 4 { 5 unsigned int width, precision; 6 int num = 256; 7 double weight = 123.45; 8 9 printf("What field width?\n"); 10 scanf("%d", &width); 11 printf("The number is: %*d:\n", width, num); 12 printf("Enter a width and a precision:\n"); 13 scanf("%d %d", &width, &precision); 14 printf("Weight = %*.*f\n", width, precision, weight); 15 16 return 0; 17 }
在Vc++6.0中的輸出結果為:

在這里,第一個問題的答案是8,所以8就是所用的字段寬度。與之類似,第二個輸入指示字段寬度為6,小數點右邊有3位數字。
5.scanf()函數的*修飾符
在scanf()函數中,當把 * 放在 % 和說明符字母之間時,它使函數跳過相應的輸入項目。
6.scanf()函數應對非法輸入的處理
1 #include <stdio.h> 2 3 int main(void) 4 { 5 int i, j; 6 char ch; 7 8 scanf("%d", &i); 9 printf("i = %d\n", i); 10 11 while ( (ch=getchar()) != '\n') 12 continue; 13 14 scanf("%d", &j); 15 printf("j = %d\n", j); 16 17 return 0; 18 } 19 /* 20 通過while循環把上面 i 輸入后的多的垃圾字符跳過 21 如果沒有while循環,在調試時輸入 i = 123asdfg 22 在Vc++6.0中的輸出結果為: 23 123asdfg 24 i = 123 25 j = -858993460 26 */
在Vc++6.0中的輸出結果為:

