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

C語言子字串提取:substr 函式實作與邊界處理

     編輯:C 語言入門

函式規格

int substr(char *dst, const char *src, int start, int len);
// 從 src 索引 start 開始,複製最多 len 個非 '\0' 字元到 dst
// dst 必須以 '\0' 結尾,回傳實際複製長度

完整健壯實作

#include 
#include 

int substr(char *dst, const char *src, int start, int len) {
    assert(dst && src);
    if (start < 0) start = 0;

    // 移動 src 到起始位置
    while (start-- > 0 && *src) src++;
    if (!*src) { *dst = '\0'; return 0; } // 起始位超出字串長度

    // 限制複製長度不超過 src 剩餘長度
    int src_remain = strlen(src);
    if (len > src_remain) len = src_remain;

    // 複製
    for (int i = 0; i < len; i++) dst[i] = src[i];
    dst[len] = '\0';
    return len;
}

關鍵邊界處理

情況處理
`start` 超過字串長度回傳 0,`dst` 設為空字串
`len` 超過剩餘長度截斷至剩餘長度
`src` 為空字串回傳 0
`dst` 空間不足呼叫端責任確保空間(或改用 `strncpy` 風格傳入 `dstsize`)

測試案例

int main() {
    char src[] = "bit-tech";
    char dst[20];

    printf("len=%d, str=%s\n", substr(dst, src, 4, 5), dst); // "tech"
    printf("len=%d, str=%s\n", substr(dst, src, 0, 3), dst);  // "bit"
    printf("len=%d, str=%s\n", substr(dst, src, 10, 5), dst); // "" (空)
    return 0;
}

標準庫替代方案

  • `strncpy(dst, src+start, len)` + 手動加 `\0`:但 `strncpy` 不保證 `\0` 結尾,且會填充 `\0` 至 `len`,效率較低。
  • `snprintf(dst, sizeof(dst), "%.*s", len, src+start)`:安全、自動 `\0`,推薦生產環境使用。

總結

子字串提取核心是**指標定位起始位置 + 長度截斷 + 確保 `\0` 結尾**。面試手寫時務必處理 `start` 越界、`len` 截斷、`\0` 結尾三大邊界,並說明 `assert`/`NULL` 檢查的防禦性設計。

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