字串本質
C 無內建字串型別,**字串 = 以 \0 結尾的字元陣列**。
char s1[] = {'a','b','c','\0'};
char s2[] = "abc"; // 編譯器自動補 \0
char *s3 = "abc"; // 指向常數區,唯讀
字串陣列(二維字元陣列)
char names[3][20] = {"Alice", "Bob", "Charlie"};
// 3 列,每列最多 19 字元 + \0
標準庫字串函數速查
| 函數 | 原型 | 行為 |
| strlen | size_t strlen(const char *s) | 回傳字串長度(**不含 \0**) |
| strcpy | char *strcpy(char *dest, const char *src) | 複製含 \0,dest 需足夠大,**不安全** |
| strncpy | char *strncpy(char *dest, const char *src, size_t n) | 最多複製 n 字元,**不保證 \0 結尾** |
| strcat | char *strcat(char *dest, const char *src) | 接在 dest \0 之後,dest 需足夠空間 |
| strcmp | int strcmp(const char *s1, const char *s2) | 字典序比較:<0 / =0 / >0 |
| strchr | char *strchr(const char *s, int c) | 尋找字元首次出現位址 |
| strstr | char *strstr(const char *haystack, const char *needle) | 尋找子字串首次出現位址 |
輸入/輸出函數對比
| 函數 | 特性 | 適用場景 |
| gets | 讀整行含空白,**不安全**(已移除 C11) | 教學/舊代碼 |
| fgets | 指定大小、保留 \n、安全 | **推薦**互動輸入 |
| scanf %s | 跳過空白、遇空白停止、不保留 \n | 格式化讀取單詞 |
| puts | 輸出字串**自動換行** | 簡單列印 |
| printf %s | 不換行、可格式化 | 通用輸出 |
安全字串處理建議
- 優先使用
snprintf/strncat/strncpy 並手動補 \0;
- 輸入緩衝區大小至少
MAX_INPUT + 1;
- 避免
gets/strcpy/strcat 無邊界版本。