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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章