標準庫 <string.h> 提供了 strcpy、strcat、strstr 等基礎接口,但實際開發中常遇到更靈活的需求:刪除字符串中所有數字、刪除首字符、刪除指定字符、字符串左右翻轉 等。本文匯總多種實用字符串處理函數,附帶完整代碼與測試。
void del_str_Num(char *str) {
int i = 0, j = 0;
while (str[i] != '\0') {
if (str[i] < '0' || str[i] > '9') { // 非數字字符保留
str[j++] = str[i];
}
i++;
}
str[j] = '\0';
}
char *ltrim(char *s, char c) {
while (*s != '\0' && *s == c) s++;
return s;
}
版本 A:雙指針原地覆蓋
char *delstr_c(char *s, char c) {
char *p = s, *q = s;
for (; *p != '\0'; p++) {
if (*p != c) *q++ = *p;
}
*q = '\0';
return s;
}
版本 B:標準庫風格
void del_str_c(char s[], int c) {
int i, j;
for (i = 0, j = 0; s[i] != '\0'; i++) {
if (s[i] != c) s[j++] = s[i];
}
s[j] = '\0';
}
char *strfilp(char *str) {
char *h = str;
char *t = str;
char ch;
// t 移動到字符串最後一個有效字符(跳過 \0)
while (*t++) ; // t 指向 \0 後一位
t--; // 回到 \0
t--; // 回到最後一個字符
while (h < t) {
ch = *h;
*h++ = *t;
*t-- = ch;
}
return str;
}
int main() {
char str[20] = "23.3hhlo965";
char *str1 = "hello";
del_str_c(str, '.'); // 刪除 '.'
printf("刪除 '.' 後: %s\n", str); // 233hhlo965
del_str_Num(str); // 刪除所有數字
printf("刪除數字後: %s\n", str); // hhlo
strfilp(str); // 翻轉字符串
printf("翻轉後: %s\n", str); // olhh
return 0;
}
刪除 '.' 後: 233hhlo965 刪除數字後: hhlo 翻轉後: olhh
| 功能 | 推薦函數 | 特點 |
|---|---|---|
| 刪除首部特定字符 | ltrim | 返回新起始指針,不修改原內存,適合去空格 |
| 刪除所有指定字符 | delstr_c / del_str_c | 原地修改,雙指針高效,版本 B 更直觀 |
| 刪除所有數字 | del_str_Num | 專用優化,可擴展為刪除任意字符集 |
| 字符串翻轉 | strfilp | 原地交換,O(n) 時間,O(1) 空間 |
掌握這些字符串進階操作,能顯著提升處理文本數據的效率。核心技巧在於雙指針原地修改:一個指針讀取,一個指針寫入,最後補 \0。翻轉則是首尾雙指針向中間交換。實際項目中,建議將常用操作封裝為工具庫,注意邊界條件(空字符串、全匹配字符等)的處理。