首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言實現字串去除首尾空白(trim)的兩種經典算法

     編輯:關於C語言

問題定義

移除字串開頭與結尾的空白字元(空格、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:

#include 
while (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(),涵蓋所有空白字元定義。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved