格式化輸出有如下形式:
// 輸出到標準輸出設備,通常爲顯示器
int printf(const char *format, …)
// 輸出到字符串
int sprintf(char *s, const char *format, …)
// 輸出到文件
int fprintf(FILE *stream, const char*format, ...)
其中,format 爲格式化輸出字符串。格式化輸出字符串由兩類字符組成:一類是普通字符,這些字符將直接被拷貝到輸出流;另一類是轉換說明,每個轉換說明都會將下一個參數進行格式轉換後發送到輸出流。轉換說明以字符‘%’ 開始,以轉換字符結束,在字符‘%’ 和轉換字符之間依次可能有如下字符:
1. 符號。
- 。規定參數轉換後左對齊。默認是右對齊。
+ 。規定打印數字時始終帶符號(正負號)。
空格。如果首個字符不是符號,則在前面輸出一個空格。
0 。如果數值轉換後數字個數小於最小寬度,在前面以0 補齊。
# 。規定另外的輸出形式。對o ,加上前綴0 ;對x 或者X ,在非零值前加上前綴0x 或者0X ;對e 、E 、f 、g 、G ,總是輸出小數點;對g 或者G ,數值末尾的0 將會保留。
2. 一個指定最小輸出寬度的數值。參數轉換後輸出的寬度必須大於或者等於該值。如果實際寬度小於該值,則在左邊補齊(如果規定了左對齊,則在右邊補齊)。默認的補齊字符是空格。如上所述,可以規定以0 補齊。
3. 句點。將輸出寬度和精度分割開。
4. 一個指定精度的數值。對s ,表示字符串中可以輸出的最大字符個數;對e 、E 、f ,表示小數點後的數字個數;對g 或者G ,表示有效數字的個數;對整數,表示輸出的數字個數(實際個數不足時,在前面以0 補齊)。
5. 長度調節字符h 、l 或者L 。h 規定參數以short 或者unsigned short 形式輸出,l 規定參數以long 或者unsigned long 形式輸出,L 規定參數以long double 形式輸出。
輸出寬度或者精度(或者兩者同時)可以用* 指定,此時輸出寬度或者精度的具體值由下一個參數給出,注意該參數必須是int 類型。
具體的輸出轉換格式見表1 :
表格 1 : 輸出轉換格式
轉換字符 |
參數類型;輸出形式 |
d ,i |
int ;有符號十進制數 |
o |
int ;無符號八進制數(沒有前綴0 ) |
x ,X |
unsigned int ;無符號十六進制數(沒有前綴0x 或者0X ),如果爲x 則用abcdef 表示10-15, 如果是X 則用ABCDEF 表示10-15 |
u |
int ;無符號十進制數 |
c |
int ;單個字符,先將int 類型參數轉換成unsigned int 類型 |
s |
char * ;打印字符串中的字符,直到遇到‘/0’ 或者已經滿足指定的精度 |
f |
double ;十進制形式:[- ]mmm.ddd ,其中d 的個數由精度指定。默認的精度爲6 ;如果精度爲0, 則省略小數點 |
e ,E |
double ;十進制形式:[- ]m.dddddde+/-xx 或者[- ]m.ddddddE+/-xx ,其中d 的個數由精度指定。默認的精度爲6 ;如果精度爲0, 則省略小數點 |
g ,G |
double ;如果指數小於-4 或者大於等於精度值,則等價與%e 或者%E ;否則等價與%f 。數值末尾的0 和小數點省略 |
p |
void * ;指針(具體輸出形式與平臺相關) |
n |
int * ;目前爲止輸出的參數個數。沒有參數被格式轉換 |
% |
沒有參數被格式轉換;輸出% |
格式化輸入有如下形式:
// 從標準輸入設備輸入,通常爲顯示器
int scanf(const char *format, …)
// 從字符串輸入
int sscanf(const char *s, const char *format, …)
// 從文件輸入
int fscanf(FILE *stream, const char *format, …)
其中format 爲格式化輸入字符串。格式化輸入字符串包括:
1. 空格或者製表符tab 。不會被忽略。
2. 普通字符(非% )。應當與輸入流中的下一個非空字符對應。
3. 轉換說明。由以下部分組成:% ,賦值抑制字符* (可選),最大寬度值(可選),長度調節字符h 、l 或者L (可選),轉換字符。
正常情況下,一個轉換說明會將下一個輸入存儲在相應地參數中,但是如果使用了賦值抑制符* ,比如%*d ,那麼會跳過下一個(整數)輸入,即該(整數)輸入不會產生賦值。一個輸入定義爲不包含空白字符(如空格、製表符、換行、回車、垂直製表符、跳頁)的字符串,如果遇到空白字符,或者超過了規定的精度,那麼該輸入終止。
對於轉換字符d 、i 、n 、o 、u 和x ,如果參數是指向short (而非int )的指針則使用長度調節字符h ,如果參數是指向long 的指針則使用長度調節字符l 。對於轉換字符e 、f 和g ,如果參數是指向double (而非float )的指針則使用長度調節字符l ,如果參數是指向long double 的指針則使用長度調節字符L 。
具體的輸入轉換格式見表2:
表格 2 : 輸入轉換格式
轉換字符 |
輸入數據;參數類型 |
d |
十進制整數;int * |
i |
整數;int * 。整數可以是八進制(以0 開頭)或者十六進制形式(以0x 或者0X 開頭) |
o |
八進制整數(不論是否以0 開頭);int * |
u |
無符號十進制整數;unsigned int |
x |
十六進制整數(不論是否以0x 或0X 開頭);int * |
c |
字符;char * 。後續輸入的字符會存儲到相應的字符數組中,直到到達給定的最大輸入寬度,默認的輸入寬度爲1 。數組末尾不會增加字符‘/0’ 。 |
s |
不包含空白字符的字符串(不需要引號);char * ,指向足夠存儲該字符串的字符數組,並且以‘/0’ 字符結束 |
e ,f ,g |
浮點數;float * 。float 的輸入形式爲:符號(可選),一個數字字符串(可能包含小數點),包含e 或者E 的指數部分(可選,指數部分的符號同樣可選) |
p |
指針值;void * |
n |
目前爲止輸入的參數個數;int * 。不讀入輸入,輸入的參數個數不增加 |
[... ] |
與括號中字符集匹配的最長非空字符串;char * 。以‘/0’ 結束。[]... ]表示第一個]在字符集中 |
[^... ] |
與非括號中字符集匹配的最長非空字符串;char * 。以‘/0’ 結束。[^ ]... ]表示第一個]在字符集中 |
% |
% ;不產生賦值 |
參考:《The C Programming Language》(2nd Edition)。作者K&R。