1. 程式人生 > >c語言的格式化輸入輸出

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 ;對eEfgG ,總是輸出小數點;對g 或者G ,數值末尾的0 將會保留。

2. 一個指定最小輸出寬度的數值。引數轉換後輸出的寬度必須大於或者等於該值。如果實際寬度小於該值,則在左邊補齊(如果規定了左對齊,則在右邊補齊)。預設的補齊字元是空格。如上所述,可以規定以0 補齊。

3. 句點。將輸出寬度和精度分割開。

4. 一個指定精度的數值。對s ,表示字串中可以輸出的最大字元個數;對eEf ,表示小數點後的數字個數;對g 或者G ,表示有效數字的個數;對整數,表示輸出的數字個數(實際個數不足時,在前面以0 補齊)。

5. 長度調節字元hl 或者Lh 規定引數以short 或者unsigned short 形式輸出,l 規定引數以long 或者unsigned long 形式輸出,L 規定引數以long double 形式輸出。

輸出寬度或者精度(或者兩者同時)可以用* 指定,此時輸出寬度或者精度的具體值由下一個引數給出,注意該引數必須是int

型別。

具體的輸出轉換格式見表1

表格 1 : 輸出轉換格式

轉換字元

引數型別;輸出形式

di

int ;有符號十進位制數

o

int ;無符號八進位制數(沒有字首0

xX

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, 則省略小數點

eE

double ;十進位制形式:[-m.dddddde+/-xx 或者[-m.ddddddE+/-xx ,其中d 的個數由精度指定。預設的精度為6 ;如果精度為0, 則省略小數點

gG

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. 轉換說明。由以下部分組成:% ,賦值抑制字元* (可選),最大寬度值(可選),長度調節字元hl 或者L (可選),轉換字元。

正常情況下,一個轉換說明會將下一個輸入儲存在相應地引數中,但是如果使用了賦值抑制符* ,比如%*d ,那麼會跳過下一個(整數)輸入,即該(整數)輸入不會產生賦值。一個輸入定義為不包含空白字元(如空格、製表符、換行、回車、垂直製表符、跳頁)的字串,如果遇到空白字元,或者超過了規定的精度,那麼該輸入終止。

對於轉換字元dinoux ,如果引數是指向short (而非int )的指標則使用長度調節字元h ,如果引數是指向long 的指標則使用長度調節字元l 。對於轉換字元efg ,如果引數是指向double (而非float )的指標則使用長度調節字元l ,如果引數是指向long double 的指標則使用長度調節字元L

具體的輸入轉換格式見表2:

表格 2 : 輸入轉換格式

轉換字元

輸入資料;引數型別

d

十進位制整數;int *

i

整數;int * 。整數可以是八進位制(以0 開頭)或者十六進位制形式(以0x 或者0X 開頭)

o

八進位制整數(不論是否以0 開頭);int *

u

無符號十進位制整數;unsigned int

x

十六進位制整數(不論是否以0x0X 開頭);int *

c

字元;char * 。後續輸入的字元會儲存到相應的字元陣列中,直到到達給定的最大輸入寬度,預設的輸入寬度為1 。陣列末尾不會增加字元‘/0’

s

不包含空白字元的字串(不需要引號);char * ,指向足夠儲存該字串的字元陣列,並且以‘/0’ 字元結束

efg

浮點數;float *float 的輸入形式為:符號(可選),一個數字字串(可能包含小數點),包含e 或者E 的指數部分(可選,指數部分的符號同樣可選)

p

指標值;void *

n

目前為止輸入的引數個數;int * 。不讀入輸入,輸入的引數個數不增加

...

與括號中字符集匹配的最長非空字串;char * 。以‘/0’ 結束。[]... ]表示第一個]在字符集中

^...

與非括號中字符集匹配的最長非空字串;char * 。以‘/0’ 結束。[^... ]表示第一個]在字符集中

%

% ;不產生賦值

參考:《The C Programming Language》(2nd Edition)。作者K&R。