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