移除字串開頭與結尾的空白字元(空格、Tab 等),中間空白保留。原始字串可選擇就地修改或輸出至新緩衝區。
strncpy)void trim(char *strIn, char *strOut) {
int i = 0;
int j = strlen(strIn) - 1;
while (strIn[i] == ' ') ++i; // 略過前導空白
while (j >= i && strIn[j] == ' ') --j; // 略過尾部空白
if (j < i) { strOut[0] = '\0'; return; } // 全空白字串
strncpy(strOut, strIn + i, j - i + 1);
strOut[j - i + 1] = '\0'; // strncpy 不自動補 \0
}
void trim(char *strIn, char *strOut) {
char *start, *end, *p;
// 尋找第一個非空白字元
p = strIn;
while (*p == ' ') ++p;
start = p;
// 尋找最後一個非空白字元
p = strIn + strlen(strIn) - 1;
while (p >= start && *p == ' ') --p;
end = p;
// 複製有效區間
for (p = start; p <= end; ) *strOut++ = *p++;
*strOut = '\0';
}
int main() {
char *input = " ak kl p ";
char output[100];
trim(input, output);
printf("*%s*\n", output); // 輸出: *ak kl p*
return 0;
}
使用 ctype.h 的 isspace() 替換 == ' ',可同時處理空格、\t、\n、\r、\v、\f:
#includewhile (isspace((unsigned char)*p)) ++p; // unsigned char 避免負值 UB
若允許修改原字串,可直接將結果寫回 strIn,但需注意記憶體重疊時 strncpy 行為未定義,指標法較安全:
void trim_inplace(char *str) {
char *start = str, *end = str + strlen(str) - 1;
while (isspace(*start)) ++start;
while (end >= start && isspace(*end)) --end;
char *dst = str;
while (start <= end) *dst++ = *start++;
*dst = '\0';
}
| 錯誤 | 後果 | 修正 |
|---|---|---|
| 未檢查全空白字串 | 索引倒轉、複製亂碼 | 加入 if (j < i) return empty |
strncpy 未手動補 \0 | 輸出字串未正確結束 | strOut[len] = '\0' |
| 直接修改字串常量 | 段錯誤 (SIGSEGV) | 確保傳入可寫緩衝區 |
未處理 \t 等空白 | 功能不完整 | 改用 isspace() |
C 語言無內建 trim,雙指標索引法碼簡單、利用標準庫;指標走訪法底層透徹、無依賴。實務上建議封裝為工具函式並支援 isspace(),涵蓋所有空白字元定義。