字符串是 C 語言中最常用、也是最容易出錯的資料類型之一。徹底理解字符串的本質、存儲方式及標準庫函數的正確用法,是寫出健壯 C 代碼的基石。
**定義**:字符串是以空字符(\0,ASCII 碼 0)結尾的 char 類型數組。
這一定義蘊含三層含義:
char(1 字節);\0 結尾**,標準庫函數(strlen、strcpy、printf("%s") 等)均依賴此終止符判斷邊界。代碼中雙引號括起的序列(如 "Hello")稱為**字符串字面量**。編譯器會:
\0;const char[],不可修改內容(嘗試修改導致未定義行為);char str1[] = "Hello"; // 棧上數組,可修改內容,大小固定 6 字節
char *str2 = "Hello"; // 指針指向只讀區,不可修改內容,指針本身可改變指向
char *str3 = malloc(6); // 堆上動態分配,可修改、可擴容、需手動 free
核心區別在於**存儲區域**與**可修改性**,這直接影響後續字符串操作函數的安全性。
<string.h>)| 函數 | 功能 | 關鍵注意點 |
|---|---|---|
strlen(s) | 計算字符串長度(不含 \0) | 若無 \0 導致越界讀取 |
strcpy(dest, src) | 複製字符串(含 \0) | 不檢查目標空間,極易溢出 |
strncpy(dest, src, n) | 最多複製 n 字符 | 若 src 長度 ≥ n,**不自動添加 \0** |
strcat(dest, src) | 拼接字符串 | 同 strcpy,需確保 dest 足夠大 |
strncat(dest, src, n) | 最多拼接 n 字符 | 保證結果以 \0 結尾 |
strcmp(s1, s2) | 字典序比較 | 返回 <0, =0, >0;區分大小寫 |
strncmp(s1, s2, n) | 比較前 n 字符 | |
strchr(s, c) | 查找字符首次出現位置 | 返回指針或 NULL |
strstr(haystack, needle) | 查找子串 | 返回指針或 NULL |
strncpy、snprintf、strncat);\0 結尾;NULL 指針、緩衝區大小;strcpy_s 等)或第三方安全庫。下一篇將深入講解字符串進階操作:分割、格式化輸入/輸出、動態字符串構建器模式等實戰技巧。