C語言格式化輸入輸出-轉換說明符的用法
本文主要介紹C語言中格式化輸入輸出語句中轉換說明(conversition specification)的用法
printf
sprintf
fprintf
的轉換說明符
% [flags][width][.precision][length]specifier
flags | 含義 |
---|---|
- | 左對齊 |
+ | 有符號值為正數時,則在值前面加上正號;若為負,則在值前面加上負號 |
space | 有符號值為正數時,則在值前面顯示空格;若為負,則在值前面加上負號 |
0 | 對於數值格式,使用0代替空格填充不足的字符;對於整數格式,如果使用了- 標志或者指定精度,則該flag不起作用 |
# | 把結果轉換成另一種格式。 如果為%o,則以0開始; 如果為%x或%X,則以0x或0X開始; 對於所有浮點類型,強制保留小數點; 對於%g或%G格式,則使其包含尾隨0 |
width | 含義 | .precision | 含義 |
---|---|---|---|
number | 輸出的最小長度(字符數) | .number | 輸出的精度。 對於%e,%E和%f而言,表示小數點右邊數字的位數 對於%g,%G而言,表示有效數字最大位數 對於%s而言,表示待打印字符的最大數量 對於整型,表示待打印數字的最小位數 單獨使用 . 與.0 的作用相同 |
* | _number_的值由待打印項列表中對應的變量決定 | .* | _number_的值由待打印項列表中對應的變量決定 |
length和specifier組合,決定如何解釋待打印列表中對應變量的數據類型,其組合關系如下表所示
length | d i | u o x X | f F e E g G a A | c | s | p | n |
---|---|---|---|---|---|---|---|
(none) | int | unsigned int | double | int | char* | void* | int* |
hh | signed char | unsigned char | signed char* | ||||
h | short int | unsigned short int | short int* | ||||
l | long int | unsigned long int | wint_t | wchar_t* | long int* | ||
ll | long long int | unsigned long long int | long long int* | ||||
j | intmax_t | uintmax_t | intmax_t* | ||||
z | size_t | size_t | size_t* | ||||
t | ptrdiff_t | ptrdiff_t | ptrdiff_t* | ||||
L | long double |
注:
(1) intmax_t
和uintmax_t
定義在stdint.h
中,是128位的整數類型
(2) size_t
定義在stddef.h
中(stdio.h
已經包含該頭文件),是sizeof()
的值的類型
(3) ptrdiff_t
是表示兩個指針差值的類型
specifier | 用於 | specifier | 用於 |
---|---|---|---|
i或d | int | a或A | 十六進制浮點數 |
u | unsigned int | c | char |
o | 無符號八進制整數 | C | ISO寬字符類型(wchar_t) |
x或X | 無符號十六進制整數(X使用大寫) | s | char*字符串 |
f或F | 浮點數類型(默認保留六位小數) | p | 指針(輸出十六進制地址) |
e或E | 顯示為科學計數法(保留六位小數) | n | 不輸出任何字符,但是會將到該位置前輸出的字符數存入后面對應的指針(默認為int*)所指的變量中 |
g或G | 根據數值不同自動選擇是否使用科學計數法表示(不含尾隨0),長度更短者優先 | % | 輸出字符'%' |
scanf
sscanf
fscanf
的轉換說明符
%[*][width][length]specifier
*和width | 含義 |
---|---|
* | 跳過對應的輸入項 (例如在語句 scanf("%*d %*d %d",&n); 中,僅將讀取到的第三個整數存入變量n 中,前兩個值被忽略) |
number | 最大字符數。輸入達到最大字符數或第一次遇到空白字符時將停止 |
length | d i | u o x | f e g a | c s [] [^] | p | n |
---|---|---|---|---|---|---|
(none) | int* | unsigned int* | float* | char* | void** | int* |
hh | signed char* | unsigned char* | signed char* | |||
h | short int* | unsigned short int* | short int* | |||
l | long int* | unsigned long int* | double* | wchar_t* | long int* | |
ll | long long int* | unsigned long long int* | long long int* | |||
j | intmax_t* | uintmax_t* | intmax_t* | |||
z | size_t* | size_t* | size_t* | |||
t | ptrdiff_t* | ptrdiff_t* | ptrdiff_t* | |||
L | long double* |
specifier | 用於 |
---|---|
i | 把輸入解釋整數,自動識別進制(輸入以0x開頭則為十六進制,以0開頭則為八進制,以1到9開頭則為十進制) |
d或u | 把輸入解釋為十進制整數(d表示有符號,u表示無符號) |
o | 把輸入解釋為有符號八進制整數 |
x | 把輸入解釋為有符號十六進制整數 |
s | 字符串(從第一個非空白字符開始,到下一個空白字符之前的所有字符都是輸入) |
p | 把輸入解釋成指針(地址) |
a,e,f,g | 把輸入解釋成浮點數(十進制或十六進制) |
c | 把輸入解釋成char字符(不忽略空白字符) |
[chatacters]和[^characters] | 掃描集,僅讀取包含在[]中的字符,排除包含在[^]中的字符,在第一個不匹配於[]中字符(或匹配於[^]中字符)的位置停止,最終讀入字符組成字符串,存入列表中對應的指針所指的連續內存空間中。 注意:僅適用於字符型變量 |