| # | 主題 | 核心技巧 |
|---|---|---|
| 1 | 字元順序歸類壓縮 | 巢狀迴圈 + 標記法 |
| 2 | IP 位址合法性驗證 | strtok 分割 + 範圍檢查 |
| 3 | 連續字元計數壓縮 | 單次掃描 + 計數器 |
| 4 | 字串解壓縮 | 數字解析 + 字元重複輸出 |
| 5 | 最長連續子串查找 | 掃描計數 + 最大值追蹤 |
| 6 | 兩字串最長公共子串 | 雙重迴圈 + 狀態旗標 |
| 7 | 單詞字典序排序 | strtok 分割 + qsort/冒泡 |
| 8 | 單詞計數 | strtok 分割計數 |
| 9 | 命名風格轉換 (蛇形↔駝峰) | 字元逐個處理 + 大小寫轉換 |
| 10 | 字串刪除指定區間 | 陣列元素前移覆蓋 |
| 11 | 字串插入指定位置 | 陣列元素後移騰空 |
| 12 | 字串替換指定區間 | 刪除 + 插入組合 |
| 13 | 子串抽取與插入 | 子串複製 + 目標插入 |
| 14 | 指標陣列字串交換 | 指標交換而非資料移動 |
| 15 | 字串陣列查找索引 | strtok + strcmp |
| 16 | 字串連接 (分隔符插入) | 迴圈輸出 + 分隔符處理 |
| 17 | 字串分割 (多字元分隔符) | 手動比對分隔符 + 截斷 |
| 18 | 字母頻率統計 | 標記法 + 計數陣列 |
// 標準庫 strtok (修改原字串、非執行緒安全)
char *p = strtok(str, "delim");
while (p) { /* process */ p = strtok(NULL, "delim"); }
// 手動分割 (支援多字元分隔符、不修改原字串)
while (str[i]) {
if (match_separator(&str[i], sep)) {
str[i] = '\0'; // 截斷
// 記錄下一段起始位址
}
i++;
}
| 操作 | 核心邏輯 | 關鍵點 |
|---|---|---|
| 刪除 | 後續元素前移覆蓋 | 邊界檢查、結束符重設 |
| 插入 | 後續元素後移騰空 | 緩衝區足夠大、結束符重設 |
| 替換 | 刪除舊 + 插入新 | 長度變化處理、分情況討論 |
// 標準庫函數 (ctype.h) isalpha(c), isdigit(c), islower(c), isupper(c) tolower(c), toupper(c) // 手動 ASCII 運算 if (c >= 'a' && c <= 'z') c -= 32; // 小寫轉大寫 if (c >= 'A' && c <= 'Z') c += 32; // 大寫轉小寫
char *ptr_array[10]; // 指標陣列:各指向不同長度字串,交換只需交換指標 char str_array[10][20]; // 二維陣列:固定寬度,交換需逐字元複製
輸入: SamSameCome 輸出: SSaammmeeCo / S2a2m3e2C1o1
技巧:外層遍歷原字串,內層尋找相同字元輸出並標記空格,最後二次掃描計數壓縮。
snake_case → camelCase: long_and_mnemonic_identifier → longAndMnemonicIdentifier camelCase → snake_case: longAndMnemonicIdentifier → long_and_mnemonic_identifier 錯誤風格檢測: bad_Style → Error! (底線後接大寫)
技巧:單次掃描,遇 _ 刪除並大寫下一字;遇大寫插入 _ 並小寫;檢測 _ 後接大寫報錯。
char *p[10]; p[0] = strtok(str, " "); for (i=0; p[i]; i++) p[i+1] = strtok(NULL, " "); // 交換指標而非資料 char *temp = p[n]; p[n] = p[m]; p[m] = temp;
優勢:O(1) 交換、不移動實際字串資料、記憶體效率高。
gets() 不安全:必須用 fgets(buf, size, stdin)strtok 破壞原字串:需備份或用手動分割strtok 非執行緒安全:多執行緒用 strtok_r 或手動實作10、12 等多位數\0這 18 道經典字串題涵蓋了 C 語言字串處理的核心技能樹:分割、統計、修改、搜尋、排序、轉換。掌握 strtok、雙指標、狀態機、指標陣列等核心模式,並養成邊界檢查、緩衝區管理、記憶體安全的工程習慣,即能從容應對面試、考試與實務開發中的各類字串處理挑戰。