第四章 字符串的格式化輸入/輸出
4.1 前導(dǎo)程序
4.2 字符串簡(jiǎn)介
C 語(yǔ)言沒(méi)有專門用于儲(chǔ)存字符串的變量類型,字符串都被儲(chǔ)存 char 類型的數(shù)組中。
C 字符串:字符末尾帶有空字符 \0。
strlen() 函數(shù)返回字符串大小不包含空字符。
4.3 常量和 C 預(yù)處理器
符號(hào)常量:用宏定義如:#define TAXRATE 0.015,TAXRATE 會(huì)在編譯時(shí)替換又叫 明示常量。
C 頭文件 linits.h 和 float.h 分別提供了與整數(shù)類型和浮點(diǎn)類型大小限制相關(guān)的詳細(xì)信息。
limits.h 中的一些明示常量
| 明示常量 | 含義 |
|---|---|
| CHARBIT |
char 類型的位數(shù) |
| CHARMAX |
char 類型的最大值 |
| CHARMIN |
char 類型的最小值 |
| SCHARMAX |
signed char 類型的最大值 |
| SCHARMIN |
signed char 類型的最小值 |
| UCHARMAX |
unsigned char 類型的最大值 |
| SHRTMAX |
short 類型的最大值 |
| SHRTMIN |
short 類型的最小值 |
| USHRTMAX |
unsigned short 類型的最大值 |
| INTMAX |
int 類型的最大值 |
| INTMIN |
int 類型的最小值 |
| UINTMAX |
unsigned int 的最大值 |
| LONGMAX |
long 類型的最大值 |
| LONGM1N |
long 類型的最小值 |
| ULONGMAX |
unsigned long 類型的最大值 |
| LLONGMAX |
long long 類型的最大值 |
| LLONGMIN |
long long 類型的最小值 |
| ULLONCMAX |
unsigned long long 類型的最大值 |
float.h 中的一些明示常量
| 明示常量 | 含義 |
|---|---|
| FLT_MANT_DIG |
float 類型的尾數(shù)位數(shù) |
| FLT_DIG |
float 類型的最少有效數(shù)字位數(shù)(十進(jìn)制) |
| FLT_MIN_10_EXP | 帶全部有效數(shù)字的 float 類型的最小負(fù)指數(shù)(以 10 為底) |
| FLT_MAX_10_EXP |
float 類型的最大正指數(shù)(以 10 為底) |
| FLT_MIN | 保留全部精度的 float 類型最小正數(shù) |
| FLT_MAX |
float 類型的最大正數(shù) |
| FLT_EPSILON |
1.00 和比 1.00 大的最小 float 類型值之間的差值 |
4.4 printf() 和 scanf()
轉(zhuǎn)換說(shuō)明及其打印的輸出結(jié)果
| 轉(zhuǎn)換說(shuō)明 | 輸出 |
|---|---|
| %a | 浮點(diǎn)數(shù)、十六進(jìn)制數(shù)和p記數(shù)法(C99/C11) |
| %A | 浮點(diǎn)數(shù)、十六進(jìn)制數(shù)和p記數(shù)法(C99/C11) |
| %c | 單個(gè)字符 |
| %d | 有符號(hào)十進(jìn)制整數(shù) |
| %e | 浮點(diǎn)數(shù),e 記數(shù)法 |
| %E | 浮點(diǎn)數(shù),e 記數(shù)法 |
| %f | 浮點(diǎn)數(shù),十進(jìn)制記數(shù)法 |
| %g | 根據(jù)值的不同,自動(dòng)選擇 %f 或 %e。%e 格式用于指數(shù)小于 -4 或者大于或等于精度時(shí) |
| %G | 根據(jù)值的不同,自動(dòng)選擇 %f 或 %e。%e 格式用于指數(shù)小于 -4 或者大于或等于精度時(shí) |
| %i | 有符號(hào)十進(jìn)制整數(shù)(與相同) |
| %o | 無(wú)符號(hào)八進(jìn)制整數(shù) |
| %p | 指針 |
| %s | 字符串 |
| %u | 無(wú)符號(hào)十進(jìn)制整數(shù) |
| %x | 無(wú)符號(hào)十六進(jìn)制整數(shù),使用十六進(jìn)制數(shù) 0f
|
| %X | 無(wú)符號(hào)十六進(jìn)制整數(shù),使用十六進(jìn)制數(shù) 0F(大寫) |
| %% | 打印一個(gè)百分號(hào) |
printf() 的修飾符
| 修飾符 | 含義 |
|---|---|
| 標(biāo)記 | 下表描述了 5 種標(biāo)記(-、+、空格、# 和 0),可以不使用標(biāo)記或使用多個(gè)標(biāo)記。示例:"%-10d"
|
| 數(shù)字 | 最小字段寬度;如果該字段不能容納待打印的數(shù)字,系統(tǒng)會(huì)使用更寬的字段。示例:"%4d"
|
| .數(shù)字 | 精度;對(duì)于 %e、%E 和 %f 轉(zhuǎn)換,表示小數(shù)點(diǎn)右邊數(shù)字的位數(shù);對(duì)于 %G 和 %G 轉(zhuǎn)換,表示有效數(shù)字最大位數(shù);對(duì)于 %s 轉(zhuǎn)換,表示待打印字符的最大數(shù)量;對(duì)于整型轉(zhuǎn)換,表示待打印數(shù)字的最小位數(shù);如有必要,使用前導(dǎo) 0 來(lái)達(dá)到這個(gè)位數(shù);只使用 . 表示其后跟隨一個(gè) 0,所以 %.f 和 %.0f 相同。示例:"%5.2f" 打印一個(gè)浮點(diǎn)數(shù),字段寬度為 5 字符,其中小數(shù)點(diǎn)后有兩位數(shù)字。 |
| h | 和整型轉(zhuǎn)換說(shuō)明一起使用,表示 short int 或 unsigned short int 類型的值。示例:"%hu"、"%hx"、"%6.4hd"。 |
| hh | 和整型轉(zhuǎn)換說(shuō)明一起使用,表示 signed char 或 unsigned char 類型的值。示例:"%hhu"、"%hhx"、"%6.4hhd"。 |
| j | 和整型轉(zhuǎn)換說(shuō)明一起使用,表示 intmax_t 或 uintmax_t 類型的值。這些定義在 stdint.h 中。示例:"%jd"、"%8jx"。 |
| l | 和整型轉(zhuǎn)換說(shuō)明一起使用,表示 long int 或 unsigned long int 類型的值。示例:"%ld"、"%8lu"。 |
| ll | 和整型轉(zhuǎn)換說(shuō)明一起使用,表示 long long int 或 unsigned long long int 類型的值(C99)。示例:"%lld"、"%8llu"。 |
| L | 和浮點(diǎn)數(shù)轉(zhuǎn)換說(shuō)明一起使用,表示 long double 類型的值。示例:"%Ld"、"%10.4Le"。 |
| t | 和整型轉(zhuǎn)換說(shuō)明一起使用,表示 ptrdiff_t 類型的值。ptrdiff_t是兩個(gè)指針差值的類型(C99)。示例:"%td"、"%12ti"。 |
| z | 和整型轉(zhuǎn)說(shuō)明一起使用,表示 sizet_t 類型的值。size_t 是 sizeof 返回的型(C99)。示例:"%zd"、"%12zd"。 |
printf() 中的標(biāo)記
| 標(biāo)記 | 含義 |
|---|---|
| - | 待打印項(xiàng)左對(duì)齊。即,從字段的左側(cè)開始打印該項(xiàng)。示例:"%-20s"
|
| + | 有符號(hào)值若為正,則在前面顯示加號(hào);若為負(fù),則在值前面顯示減號(hào)。示例:"%+6.2f"
|
| 空格 | 有符號(hào)值若為正,則在前面顯示前導(dǎo)空格(不顯示任何符號(hào));若為負(fù),則在值前面顯示減號(hào)+標(biāo)記覆蓋一個(gè)空格。示例:"%6.2f"
|
| # | 把結(jié)果轉(zhuǎn)為另一種形式。如果是 %o 格式,則以 0 開始;如果是 %x 或 %X 格式,則以 0x 或 0X 開始;對(duì)于所有的浮點(diǎn)格式,# 保證了即使后面沒(méi)有任何數(shù)字,也打印一個(gè)小數(shù)點(diǎn)字符。對(duì)于 %g 和 %G 格式,# 防止結(jié)果后面的 0 被刪除。示例:"%#o"、"%#8.0f"、"%+#10.3e"
|
| 0 | 對(duì)于數(shù)值格式,用前導(dǎo) 0 代替空格填充字段寬度。對(duì)于整數(shù)格式,如果出現(xiàn)-標(biāo)記或指定精度,則忽略改標(biāo)記。 |
printf() 要注意轉(zhuǎn)換說(shuō)明要與待打印值得類型匹配。這是 printf() 不定參數(shù)要求,原理:將待打印值壓棧,根據(jù)轉(zhuǎn)換類型出棧。所以轉(zhuǎn)換類型如果不一致(壓棧、出棧大小不一樣)可能會(huì)破壞棧結(jié)構(gòu)。
scanf() 與 printf() 轉(zhuǎn)換說(shuō)明類似。
scanf() 格式化輸入,要求遵循指定格式才能正確輸入。
scanf() 返回值:0:格式不匹配;EOF:檢測(cè)到文件尾。
*** 修飾符**
-
printf()通過(guò)程序指定字段寬度。如下:printf("The number is %*d\n", 7, number); -
scanf()跳過(guò)相應(yīng)的輸入項(xiàng),僅讀取指定項(xiàng)。如下:scanf("%*d %*d %d", &n);
C 語(yǔ)言有其本地化設(shè)置。