C Primer Plus 第4章(字符串和格式化输入输出)
生活随笔
收集整理的這篇文章主要介紹了
C Primer Plus 第4章(字符串和格式化输入输出)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
- 1. 字符串簡介
- 1.1 char類型數(shù)組和null字符
- 1.2 使用字符串
- 字符串和字符
- 1.3 strlen()函數(shù)
- 2. 常量和C預(yù)處理器
- 2.1 const 限定符
- 2.2 明示常量
- 3. printf()和scanf()
- 3.1 printf()函數(shù)
- 3.2 使用printf()
- 3.3 printf()的轉(zhuǎn)換說明修飾符
- 使用修飾符和標(biāo)記的示例
- 3.4 轉(zhuǎn)換說明的意義
- 3.4.1 轉(zhuǎn)換不匹配
- 參數(shù)傳遞
- 3.4.2 printf()的返回值
- 3.4.3 打印較長的字符串
- 3.5 使用scanf()
- 3.5.1 從scanf()角度看輸入(坑)
- 3.5.2 格式字符串中的普通字符(內(nèi)存原理未知)
- 3.5.3 scanf() 的返回值
- 3.6 printf() 和 scanf() 的 * 修飾符
- 3.7 printf()的用法提示
1. 字符串簡介
1.1 char類型數(shù)組和null字符
- C語言沒有專門用于存儲字符串的變量類型,字符串都被存儲在 char 類型的數(shù)組中
- 數(shù)組由連續(xù)的存儲單元組成,字符串中的字符被存儲在相鄰的存儲單元中,每個單元存儲一個字符
| 每個儲存單元1字節(jié) | 空字符 |
- \0:空字符(null character),C語言用它標(biāo)記字符串的結(jié)束
- 數(shù)組的容量必須比待存儲字符串中的字符數(shù)多1
1.2 使用字符串
- C語言使用 %s 打印字符串
字符串和字符
| 基本類型(char) | 派生類型(char 數(shù)組) |
| 1個字符組成(‘a(chǎn)’) | 2個字符組成(‘a(chǎn)’ 和 \0) |
1.3 strlen()函數(shù)
- strlen()函數(shù):給出字符串中的字符長度
- strlen() 函數(shù)知道在何處停止,不會將空字符計入
2. 常量和C預(yù)處理器
-
使用符號常量(symbolic constant),只需更改符號常量的定義,不用在程序中查找使用常量的地方,然后逐一修改
-
創(chuàng)建符號常量
-
聲明變量,并將其賦值
int i = 1;- 問題:程序可能無意間改變變量的值
-
C預(yù)處理器
#define i 1- 程序中所有的 i 都會被替換成 1,這一過程被稱為編譯時替換(compile-time substitution)
- 在運(yùn)行程序時,程序中所有的替換均已完成
- 這樣定義的常量也被稱為明示常量(manifest constant)
-
2.1 const 限定符
- C90新增 const 關(guān)鍵字,用于限定一個變量為只讀
- 只讀:可以計算、打印,無法修改
2.2 明示常量
- limits.h:提供與整數(shù)類型大小限制相關(guān)的詳細(xì)信息
| CHAR_BIT | char 類型的位數(shù) |
| CHAR_MAX | char 類型的最大值 |
| CHAR_MIN | char 類型的最小值 |
- 可將以上的 CHAR 替換成其他常量名
| CHAR | char 類型 |
| SCHAR | signed char 類型 |
| UCHAR | unsigned char 類型 |
| SHRT | short 類型 |
| USHRT | unsigned char 類型 |
| INT | int 類型 |
| UINT | unsigned int 類型 |
| LONG | long 類型 |
| ULONG | unsigned long 類型 |
| LLONG | long long 類型 |
| ULLONG | unsigned long long 類型 |
- float.h:提供與浮點(diǎn)數(shù)類型大小限制相關(guān)的詳細(xì)信息
| FLT_MANT_DLG | 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類型值之間的差值 |
- 可將以上的 FLT 替換成其他常量名
| FLT | float 類型 |
| DBL | double 類型 |
| LDBL | long double 類型 |
3. printf()和scanf()
-
I/O 函數(shù)
-
printf():輸出函數(shù)
-
scanf():輸入函數(shù)
3.1 printf()函數(shù)
| %a | 浮點(diǎn)數(shù)、十六進(jìn)制數(shù)和 p 記數(shù)法(C99 / C11) |
| %A | 浮點(diǎn)數(shù)、十六進(jìn)制數(shù)和 p 記數(shù)法(C99 / C11) |
| %c | 單個字符 |
| %d | 有符號十進(jìn)制整數(shù) |
| %e | 浮點(diǎn)數(shù),e 記數(shù)法 |
| %E | 浮點(diǎn)數(shù),E 記數(shù)法 |
| %f | 浮點(diǎn)數(shù),十進(jìn)制記數(shù)法 |
| %g | 根據(jù)值的不同,自動選擇 %f 或 %e;%e 格式用于指數(shù)小于 -4 或者大于或等于精度 |
| %G | 根據(jù)值的不同,自動選擇 %f 或 %E;%E 格式用于指數(shù)小于 -4 或者大于或等于精度 |
| %i | 有符號十進(jìn)制整數(shù)(與 %d 相同) |
| %o | 無符號八進(jìn)制整數(shù) |
| %p | 指針 |
| %s | 字符串 |
| %u | 無符號十進(jìn)制整數(shù) |
| %x | 無符號十六進(jìn)制整數(shù),使用十六進(jìn)制數(shù) 0f |
| %X | 無符號十六進(jìn)制整數(shù),使用十六進(jìn)制數(shù) 0F |
| %% | 打印一個百分號 |
3.2 使用printf()
#include <stdio.h> #define i 10int main() {printf("%c %d %%\n", '$', 2 * i);// $ 20 % }3.3 printf()的轉(zhuǎn)換說明修飾符
| 標(biāo)記 | 標(biāo)記 | “%-10d” |
| 數(shù)字 | 最小字段寬度 如果該字段不能容納待打印的數(shù)字或字符串,系統(tǒng)會使用更寬的字段 | “%4d” |
| .數(shù)字 | 精度 對于 %e、%E 和 %f 轉(zhuǎn)換,表示小數(shù)點(diǎn)右邊數(shù)字的位數(shù) 對于 %g 和 %G 轉(zhuǎn)換,表示有效數(shù)字最大位數(shù) 對于 %s 轉(zhuǎn)換,表示待打印字符的最大數(shù)量 對于整型轉(zhuǎn)換,表示待打印數(shù)字的最小位數(shù) | "%5.2f"打印一個浮點(diǎn)數(shù) 字段寬度為5字符,其中小數(shù)點(diǎn)后有2位數(shù)字 |
| h | 和整型轉(zhuǎn)換說明一同使用,表示 short int 或 unsigned short int 類型的值 | “%hu”,"%hx","%6.4hd" |
| hh | 和整型轉(zhuǎn)換說明一同使用,表示 signed char 或 unsigned char 類型的值 | “%hhu”,"%hhx","%6.4hhd" |
| j | 和整型轉(zhuǎn)換說明一同使用,表示 intmax_t 或 uintmax_t 類型的值 這些類型定義在stdint.h中 | “%jd”,"%8jx" |
| l | 和整型轉(zhuǎn)換說明一同使用,表示 long int 或 unsigned long int 類型的值 | “%ld”,"%8lu" |
| ll | 和整型轉(zhuǎn)換說明一同使用,表示 long long int 或 unsigned long long int 類型的值(C99) | “%lld”,"%8llu" |
| L | 和浮點(diǎn)轉(zhuǎn)換說明一同使用,表示 long double 類型的值 | “%Lf”,"%10.4Le" |
| t | 和整型轉(zhuǎn)換說明一同使用,表示 ptrdiff_t 類型的值 ptrdiff_t 是2個指針差值的類型(C99) | “%td”,"%12ti" |
| z | 和整型轉(zhuǎn)換說明一同使用,表示 size_t 類型的值 size_t 是 sizeof 返回的類型 | “%zd”,"%12zd" |
| - | 待打印項左對齊,即從字段的左側(cè)開始打印該項 | “%-20s” |
| + | 有符號值若為正,則在前面顯示加號 有符號值若為負(fù),則在前面顯示減號 | “%+6.2f” |
| 空格 | 有符號值若為正,則在前面顯示前導(dǎo)空格(不顯示任何符號) 有符號值若為負(fù),則在前面顯示減號 | “% 6.2f” |
| # | 把結(jié)果轉(zhuǎn)換為另一種形式 如果為 %o,則以 0 開始 如果為 %x 或 %X,則以 0x 或 0X 開始 對于所有的浮點(diǎn)格式,即使后面沒有任何數(shù)字,也打印一個小數(shù)點(diǎn)字符 對于 %g 和 %G,防止結(jié)果后面的 0 被刪除 | “%#o”,"%#8.0f","%+#10.3e" |
| 0 | 對于數(shù)值,用前導(dǎo) 0 代替空格填充字段寬度 對于整數(shù)格式,如果出現(xiàn) - 標(biāo)記或指定精度,則忽略該標(biāo)記 | “%010d”,"%08.3f" |
使用修飾符和標(biāo)記的示例
#include <stdio.h>int main() {int i = 123;printf("%d\n", i);// 123printf("%2d\n", i);// 123printf("%5d\n", i);// 123printf("%-5d\n", i);// 123 } #include <stdio.h>int main() {double d = 1.234;printf("%f\n", d);// 1.234000printf("%e\n", d);// 1.234000e+00printf("%4.2f\n", d);// 1.23printf("%3.1f\n", d);// 1.2printf("%10.3f\n", d);// 1.234printf("%10.3E\n", d);// 1.234E+00printf("%+4.2f\n", d);// +1.23printf("%010.2f\n", d);// 0000001.23 }3.4 轉(zhuǎn)換說明的意義
3.4.1 轉(zhuǎn)換不匹配
#include <stdio.h>int main() {int i = 336;int j = 65618;printf("short = %hd, unsigned short = %hu\n", i, i);// short = 336, unsigned short = 336printf("short = %hd, unsigned short = %hu\n", -i, -i);// short = -336, unsigned short = 65200printf("int = %d, char = %c\n", i, i);// int = 336, char = P// 336 = 256 + 80;80 = Pprintf("int = %d, short = %hd, char = %c\n", j, j, j);// int = 65618, short = 82, char = R// 65618 = 65536 + 82// 65618 = 256 * 256 + 82;82 = R}參數(shù)傳遞
#include <stdio.h>int main() {float f = 1.0f;double d = 123456789.0;long l1 = 1, l2 = 1;printf("%ld %ld %ld %ld\n", f, d, l1, l2);// 0 1072693248 1409286144 1100836660 }- 第一個 %ld 獲取 f 的前 4 個字節(jié)
- 第二個 %ld 獲取 f 的后 4 個字節(jié)
- 第三個 %ld 獲取 d 的后 4 個字節(jié)
- 第四個 %ld 獲取 d 的后 4 個字節(jié)
3.4.2 printf()的返回值
- printf() 函數(shù)返回值為打印字符的個數(shù)
3.4.3 打印較長的字符串
#include <stdio.h>int main() {printf("abc ");printf("ABC\n");printf("abc \ ABC\n");printf("abc ""ABC\n"); }3.5 使用scanf()
| 參數(shù)列表:變量、常量和表達(dá)式 | 指向變量的指針 |
- 如果用 scanf() 讀取基本變量類型的值,在變量名前加上 &
- 如果用 scanf() 把字符串讀入字符數(shù)組中,不要使用 &
| %c | 字符 |
| %d | 有符號十進(jìn)制整數(shù) |
| %e、%f、%g、%a | 浮點(diǎn)數(shù)(C99新增 %a) |
| %E、%F、%G、%A | 浮點(diǎn)數(shù)(C99新增 %A) |
| %i | 有符號十進(jìn)制整數(shù) |
| %o | 有符號八進(jìn)制整數(shù) |
| %p | 指針(地址) |
| %s | 字符串 從第一個非空白字符開始,到下一個空白字符之前的所有字符 |
| %u | 無符號十進(jìn)制整數(shù) |
| %x、%X | 有符號十六進(jìn)制整數(shù) |
| * | 抑制賦值 | “%*d” |
| 數(shù)字 | 最大字段寬度 輸入達(dá)到最大字段寬度處,或第1次遇到空白字符停止 | “%10s” |
| hh | 把整數(shù)作為 signed char 或 unsigned char 類型讀取 | “%hhd”、"%hhu" |
| ll | 把整數(shù)作為 long long 或 unsigned long long 類型讀取(C99) | “%lld”、"%llu" |
| h、l 或 L | 把整數(shù)作為 short、long 類型讀取 | “%hd”、"%ld" |
| j | 使用 intmax_t 或 uintmax_t 類型(C99) | “%jd”、"%ju" |
| z | 使用 sizeof 的返回值類型(C99) | “%zd”、"%zo" |
| t | 使用表示2個指針差值的類型(C99) | “%td”、"%tx" |
3.5.1 從scanf()角度看輸入(坑)
-
scanf() 從緩沖區(qū)獲取數(shù)據(jù)
-
scanf() 會將所有輸入的數(shù)據(jù)全部送入緩沖區(qū),在緩沖區(qū)中按照輸入條件獲取數(shù)據(jù),并將獲取的數(shù)據(jù)從緩沖區(qū)刪除
-
在輸入獲取之后,如有數(shù)據(jù)殘留,保留該數(shù)據(jù),當(dāng)下次使用 scanf() 時從緩沖區(qū)獲取,不再進(jìn)行輸入
-
當(dāng)緩沖區(qū)為空時才會讓用戶進(jìn)行輸入
-
scanf() 將字符串類型數(shù)據(jù)送入執(zhí)行數(shù)組中時,會自動在字符序列的末尾添加 ‘\0’
3.5.2 格式字符串中的普通字符(內(nèi)存原理未知)
- 用戶需要嚴(yán)格按照 scanf() 中格式字符串的格式進(jìn)行輸入
3.5.3 scanf() 的返回值
- scanf() 函數(shù)返回值為成功讀取的項數(shù)
3.6 printf() 和 scanf() 的 * 修飾符
- printf()
- scanf()
3.7 printf()的用法提示
- 使用足夠大的固定字段寬度讓輸出整齊美觀
- 在文字中嵌套數(shù)字,指定一個小于或等于該數(shù)字寬度的字段
總結(jié)
以上是生活随笔為你收集整理的C Primer Plus 第4章(字符串和格式化输入输出)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 涉及到c语言的专业,大学里哪些专业开设C
- 下一篇: 终端进程启动失败: shell 可执行文