c語言的格式化輸入輸出
格式化輸出有如下形式:
// 輸出到標準輸出裝置,通常為顯示器
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。