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