printf、sprintf、scanf、sscanf等格式化函數(shù)在使用是需要特別小心,另外如果使用scanf_s這樣的安全函數(shù),更應當小心,因為如果格式控制有問題,可能直接導致格式化失敗或運行時錯誤。 表一:轉換說明符及作為結果的打印輸出
| 轉換說明 | 輸出 |
|---|---|
| %a | 浮點數(shù)、十六進制數(shù)字和p-記數(shù)法 (C99) |
| %A | 浮點數(shù)、十六進制數(shù)字和P-記數(shù)法 (C99) |
| %c | 一個字符 |
| %d | 有符號十進制整數(shù) |
| %e | 浮點數(shù)、e-記數(shù)法 |
| %E | 浮點數(shù)、E-記數(shù)法 |
| %f | 浮點數(shù),十進制記數(shù)法 |
| %g | 根據(jù)數(shù)值不同自動選擇%f或者%e。%e格式在指數(shù)小于-4或者大于等于精度時使用 |
| %G | 根據(jù)數(shù)值不同自動選擇%f或者%E。%E格式在指數(shù)小于-4或者大于等于精度時使用 |
| %i | 有符號十進制整數(shù) (與%d相同) |
| %o | 無符號八進制整數(shù) |
| %p | 指針(就是指地址) |
| %s | 字符串 |
| %u | 無符號十進制整數(shù) |
| %x | 使用十六進制數(shù)字0f 的無符號十六進制整數(shù) |
| %X | 使用十六進制數(shù)字0F的無符號十六進制整數(shù) |
| %% | 打印一個百分號 |
表二:printf() 修飾符
| 修飾符 | 意義 |
|---|---|
| 標志 | 五種標志 (-、+、空格、# 和0) 都將在表三中描述,可以使用零個或多個標志 |
| digit(s) | 字段寬度的最小值。如果該字段不能容納要打印的數(shù)或者字符串,系統(tǒng)會使用更寬的字段。示例:“%4d” |
| .digit(s) | 精度。對于%e、%E和%f轉換,是將要在小數(shù)點的右邊打印的數(shù)字的位數(shù)。對于%g和%G轉換,是有效數(shù)字的最大位數(shù)。對于%s轉換,是將要打印的字符的最大數(shù)目。對于整數(shù)轉換,是將要打印的數(shù)字的最小位數(shù);如果必要,要使用前導零來達到這個位數(shù)。只使用“.”表示其后跟隨一個零,所以%.f與%.0f相同。示例:“%5.2f”打印一個浮點數(shù),他的字段寬度為5個字符,小數(shù)點后有兩個數(shù)字。 |
| h | 和整數(shù)轉換說明符一起使用,表示一個short int 或者 unsigned short int 類型數(shù)值。示例:“%hu”、“%hx”和“%6.4hd” |
| hh | 和整數(shù)轉換說明符一起使用,表示一個signed char 或者unsigned char類型數(shù)值。示例:“%hhu”、“%hhx”和“%6.4hhd” |
| j | 和整數(shù)轉換說明符一起使用,表示一個intmax_t或uintmax_t值。示例:“%jd”和“%8jX” |
| l | 和整數(shù)說明符一起使用,表示一個long int 或者unsigned long int 類型值。示例:“%ld”和“%8lu” |
| ll | 和整數(shù)說明符一起使用,表示一個long long int或 unsigned long long int 類型值 (C99)。示例:“%lld”和“%8llu” |
| L | 和浮點轉換說明符一起使用,表示一個long double值。示例:“%Lf”和“%10.4Le” |
| t | 和整數(shù)轉換說明符一起使用,表示一個ptrdiff_t值(與兩個指針之間的差相對應的類型) (C99)示例:“%td”和“%12ti” |
| z | 和整數(shù)轉換說明符一起使用,表示一個size_t值(sizeof返回的類型) (C99)。示例:“%zd”和“%12zx” |
表三:printf()的標志
| 修飾符 | 意義 |
|---|---|
| - | 項目是左對齊的,也就是說,會把項目打印在字段的左側開始處。示例:“%-20s” |
| + | 有符號的值若為正,則顯示帶加號的符號;若為負,則帶減號的符號。示例:“%+6.2f” |
| (空格) | 有符號的值若為正,則顯示時帶前導空格(但是不顯示符號);若為負,則帶減號符號。+標志會覆蓋空格標志。示例:“% 6.2f” |
| # | 使用轉換說明的可選形式。若為%o格式,則以0開始;若為%x和%X格式,則以0x或0X開始,對于所有的浮點形式,#保證了即使不限任何數(shù)字,也打印一個小數(shù)點字符。對于%g和%G格式,它防止尾隨零被刪除。示例:“%#o”、“%#8.0f”和“%+#10.3E” |
| 0 | 對于所有的數(shù)字格式,用前導零而不是用空格填充字段寬度。如果出現(xiàn)-標志或者指定了精度(對于整數(shù))則忽略該標志。示例:“%010d”和“%08.3f” |
表四:ANSIC 中 scanf()的轉換說明符
| 轉換說明符 | 意義 |
|---|---|
| %c | 把輸入解釋成一個字符 |
| %d | 把輸入解釋成一個有符號十進制整數(shù) |
| %e,%f,%g, %a | 把輸入解釋成一個浮點數(shù) (%a是C99標準) |
| %E,%F,%G,%A | 把輸入解釋成一個浮點數(shù) (%A是C99標準) |
| %i | 把輸入解釋成一個有符號十進制整數(shù) |
| %o | 把輸入解釋成一個有符號八進制數(shù) |
| %p | 把輸入解釋成一個指針(地址) |
| %s | 把輸入解釋成一個字符串;輸入的內容以一個非空白字符作為開始,并且包含知道下一個空白字符的全部字符 |
| %u | 把輸入解釋成一個無符號十進制整數(shù) |
| %x,%X | 把輸入解釋成一個有符號十六進制整數(shù) |
表五: scanf()的轉換修飾符
| 修飾符 | 意義 |
|---|---|
| * | 滯后賦值。示例:“%*d” |
| digit(s) | 最大字段寬度;在達到最大字段寬度或者遇到第一個空白字符時(不管哪一個先發(fā)生都一樣)停止對輸入項的讀取。示例:“%10s” |
| hh | 把整數(shù)讀作signed char 或 unsigned char 。示例:“%hhd”“%hhu” |
| ll | 把整數(shù)讀作long long或者 unsigned long long (C99)。示例:“%lld”“%llu” |
| h,l或L | “%hd”和“hi”指示該值將會存儲在一個short int中。“%ho”“%hx”和“%hu”指示該值將會存儲在一個unsigned short int中。“%ld”和“%li”指示該值將會存儲在一個long中。“%lo”“%lx”和“%lu”指示該值將會存儲在一個unsigned long中。“%le”“%lf”和“%lg”指示該值以double類型存儲。將L(而非l)與e、f和g一起使用指示該值以long double類型存儲。如果沒有這些修飾符,d、i、o和x指示int類型,而e、f和g指示float類型。 |
表附一:特別說明符
| 轉換說明符 | 意義 |
|---|---|
| %I64 | 配合u,d等,可以輸入輸出64位整數(shù).MSVC平臺有效.如%I64u , %I64d. 注意大寫 |
小結:一個字節(jié)的用%c,%hhu,%hhd等,兩個字節(jié)用%hu,%hd等,四個字節(jié)用%d,%u等8個字節(jié)的用%lld,%llu等. 盡量不要用%I64d這樣不兼容的格式.
新聞熱點
疑難解答