提供六個函數,涵蓋左側、右側、雙側修剪,支援字元集合(filter 字串)與單一字元(ch)兩種模式:
int ltrim_str(char *str, const char *filter);int rtrim_str(char *str, const char *filter);int trim_str(char *str, const char *filter);int ltrim_ch(char *str, char ch);int rtrim_ch(char *str, char ch);int trim_ch(char *str, char ch);回傳值:成功回傳移除字元總數,參數為 NULL 回傳 -1。
// 左修剪:字元集合版
int ltrim_str(char *str, const char *filter) {
if (!str || !filter) return -1;
char *ptr = str;
while (*ptr && strchr(filter, *ptr)) ++ptr;
strcpy(str, ptr);
return ptr - str;
}
// 右修剪:字元集合版
int rtrim_str(char *str, const char *filter) {
if (!str || !filter) return -1;
int len = strlen(str), i;
for (i = len - 1; i >= 0; --i)
if (!strchr(filter, str[i])) break;
str[i + 1] = '\0';
return len - i - 1;
}
// 雙側修剪:組合左右
int trim_str(char *str, const char *filter) {
if (!str || !filter) return -1;
return ltrim_str(str, filter) + rtrim_str(str, filter);
}
// 單一字元版本:直接比較 *ptr != ch / str[i] != ch,其餘邏輯相同
char s1[] = " 111abcde*+*+";
char s2[] = " 111abcde*+*+";
ltrim_str(s1, "1 "); // 移除前導 '1' 與空白 → "abcde*+*+"
rtrim_str(s1, "*+"); // 移除尾部 '*' '+' → "abcde"
trim_str(s2, "*+1 "); // 一次移除首尾所有指定字元 → "abcde"
" \t\r\n")。可擴充為 trim_str_ex(str, filter, flags),支援 TRIM_LEFT, TRIM_RIGHT, TRIM_BOTH 旗標,或整合至字串工具庫中。