日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C Primer Plus 第4章(字符串和格式化输入输出)

發布時間:2023/12/29 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 類型的數組中
  • 數組由連續的存儲單元組成,字符串中的字符被存儲在相鄰的存儲單元中,每個單元存儲一個字符
abc\0
每個儲存單元1字節空字符
  • \0:空字符(null character),C語言用它標記字符串的結束
  • 數組的容量必須比待存儲字符串中的字符數多1
char c; // 分配1個字節char c[5]; // 分配5個字節

1.2 使用字符串

  • C語言使用 %s 打印字符串
#include <stdio.h>int main() {char c[5] = "abc";printf("%s\n", c); }

字符串和字符

字符(‘a’)字符串(“a”)
基本類型(char)派生類型(char 數組)
1個字符組成(‘a’)2個字符組成(‘a’ 和 \0)

1.3 strlen()函數

  • strlen()函數:給出字符串中的字符長度
#include <stdio.h> #include <string.h> // 提供 strlen() 函數的原型int main() {char c[5] = "abc";printf("length of %s is %zd\n", c, strlen(c));// length of abc is 3 }
  • strlen() 函數知道在何處停止,不會將空字符計入

2. 常量和C預處理器

  • 使用符號常量(symbolic constant),只需更改符號常量的定義,不用在程序中查找使用常量的地方,然后逐一修改

  • 創建符號常量

    • 聲明變量,并將其賦值

      int i = 1;
      • 問題:程序可能無意間改變變量的值
    • C預處理器

      #define i 1
      • 程序中所有的 i 都會被替換成 1,這一過程被稱為編譯時替換(compile-time substitution)
      • 在運行程序時,程序中所有的替換均已完成
      • 這樣定義的常量也被稱為明示常量(manifest constant)

2.1 const 限定符

  • C90新增 const 關鍵字,用于限定一個變量為只讀
  • 只讀:可以計算、打印,無法修改
const int i = 1;

2.2 明示常量

  • limits.h:提供與整數類型大小限制相關的詳細信息
明示常量含義
CHAR_BITchar 類型的位數
CHAR_MAXchar 類型的最大值
CHAR_MINchar 類型的最小值
  • 可將以上的 CHAR 替換成其他常量名
明示常量含義
CHARchar 類型
SCHARsigned char 類型
UCHARunsigned char 類型
SHRTshort 類型
USHRTunsigned char 類型
INTint 類型
UINTunsigned int 類型
LONGlong 類型
ULONGunsigned long 類型
LLONGlong long 類型
ULLONGunsigned long long 類型
  • float.h:提供與浮點數類型大小限制相關的詳細信息
明示常量含義
FLT_MANT_DLGfloat 類型的尾數位數
FLT_DIGfloat 類型的最少有效數字位數(十進制)
FLT_MIN_10_EXP帶全部有效數字的 float 類型的最小負指數(以10為底)
FLT_MAX_10_EXPfloat 類型的最大正指數(以10為底)
FLT_MIN保留全部精度的 float 類型最小正數
FLT_MAXfloat 類型的最大正數
FLT_EPSILON1.00和比1.00大的最小float類型值之間的差值
  • 可將以上的 FLT 替換成其他常量名
明示常量含義
FLTfloat 類型
DBLdouble 類型
LDBLlong 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()

printf()scanf()
參數列表:變量、常量和表達式指向變量的指針
  • 如果用 scanf() 讀取基本變量類型的值,在變量名前加上 &
  • 如果用 scanf() 把字符串讀入字符數組中,不要使用 &
#include <stdio.h>int main() {int i;float f;char c[10];printf("i, f = ");scanf("%d %f", &i, &f);printf("c[10] = ");scanf("%s", c);printf("%d %.2f %s\n", i, f, c); } 轉換說明含義
%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’

#include <stdio.h>int main() {int i;char c[10];scanf("%d %s", &i, c);// 1.23 abcprintf("i = %d, c[10] = %s\n", i, c);// i = 1, c[10] = .23scanf("%s", c);printf("c[10] = %s\n", c);// c[10] = abc }

3.5.2 格式字符串中的普通字符(內存原理未知)

  • 用戶需要嚴格按照 scanf() 中格式字符串的格式進行輸入
#include <stdio.h>int main() {int i;char c[10];scanf("%d, %s", &i, c);// 1,abcprintf("i = %d, c[10] = %s\n", i, c);// i = 1, c[10] = abc }

3.5.3 scanf() 的返回值

  • scanf() 函數返回值為成功讀取的項數

3.6 printf() 和 scanf() 的 * 修飾符

  • printf()
#include <stdio.h>int main() {int i = 6;int j = 8;int a = 1234;double d = 242.5;printf("%*d\n", i, a);// 1234printf("%*.*f\n", j, i, d);// 242.500000 }
  • scanf()
#include <stdio.h>int main() {int i = 0;scanf("%*d %*d %d", &i);// 1 2 3printf("%d\n", i);// 3 }

3.7 printf()的用法提示

  • 使用足夠大的固定字段寬度讓輸出整齊美觀
#include <stdio.h>int main() {printf("%d %d %d\n", 1, 123, 12345);printf("%d %d %d\n", 12345, 123, 1);// 1 123 12345// 12345 123 1printf("%7d %7d %7d\n", 1, 123, 12345);printf("%7d %7d %7d\n", 12345, 123, 1);// 1 123 12345// 12345 123 1 }
  • 在文字中嵌套數字,指定一個小于或等于該數字寬度的字段
#include <stdio.h>int main() {printf("ABC %10.2f abc\n", 1.234);// ABC 1.23 abcprintf("ABC %.2f abc\n", 1.234);// ABC 1.23 abc }

總結

以上是生活随笔為你收集整理的C Primer Plus 第4章(字符串和格式化输入输出)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。