字符串分割是C語言開發中的高頻需求。許多開發者(包括筆者早期)選擇手寫解析函數,殊不知 `
筆者早期實現的 `strsplit` 採用「精確匹配分隔符」策略:分隔符 `"##"` 僅當子串完全等於 `"##"` 時才分割,輸入 `"abc##123###a##"` 會產生 `"abc"`、`"123"`、`"#a"`。這與標準庫「任意字符分割」語義不同(後者視 `#` 為單一分隔符,產生 `"abc"`、`"123"`、`"a"`)。代碼邏輯雖清晰,但需自行處理邊界、空串、多字符分隔符等細節,維護成本高。
char *strtok(char *str, const char *delim);
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
char *s, *d, *t;
if (argc < 3) {
printf("%s\n", "wrong args. usage: str delim");
exit(1);
}
s = argv[1];
d = argv[2];
t = strtok(s, d);
while (t != NULL) {
printf("%s\n", t);
t = strtok(NULL, d); // 關鍵:傳 NULL 繼續分割
}
return 0;
}
每次調用 `strtok(NULL, new_delim)` 可更換分隔符集,適配「不同字段用不同分隔符」的場景(如解析 CSV 首行用 `,`,次行用 `;`),但鮮見實戰應用。
除非需要「精確匹配多字符分隔符」或「保留空字段」,優先使用 `strtok`/`strtok_r`。標準庫經過無數項目驗證,性能與穩定性遠超手寫代碼。下次想造輪子時,先翻翻 `