封裝常用字符串操作(複製、拼接、比較、查找、分割、大小寫轉換等),提供統一、安全、可復用的 API,避免重複造輪子與緩衝區溢出風險。
// strutil.h #ifndef STRUTIL_H #define STRUTIL_H #include#include #ifdef __cplusplus extern "C" { #endif // 安全複製,保證以 \0 結尾,返回實際複製長度 size_t str_copy(char *dst, size_t dst_size, const char *src); // 安全拼接 size_t str_cat(char *dst, size_t dst_size, const char *src); // 大小寫無關比較 int str_icmp(const char *s1, const char *s2); // 查找子串(返回偏移,未找到 -1) int str_find(const char *haystack, const char *needle); // 分割字符串,調用者負責釋放返回數組 char **str_split(const char *str, const char *delim, int *count); // 去除首尾空白字符 void str_trim(char *str); // 大小寫轉換 void str_toupper(char *str); void str_tolower(char *str); // 動態字符串構建器(類似 StringBuilder) typedef struct StrBuilder StrBuilder; StrBuilder *sb_create(void); void sb_append(StrBuilder *sb, const char *fmt, ...); void sb_append_char(StrBuilder *sb, char c); char *sb_build(StrBuilder *sb); // 返回所有權給調用者 void sb_destroy(StrBuilder *sb); #ifdef __cplusplus } #endif #endif
// strutil.c #include "strutil.h" #include#include #include #include #include size_t str_copy(char *dst, size_t dst_size, const char *src) { if (!dst || !src || dst_size == 0) return 0; size_t len = strlen(src); size_t n = (len < dst_size - 1) ? len : dst_size - 1; memcpy(dst, src, n); dst[n] = '\0'; return n; } char **str_split(const char *str, const char *delim, int *count) { if (!str || !delim) { if (count) *count = 0; return NULL; } char *copy = strdup(str); int cap = 8, n = 0; char **arr = malloc(cap * sizeof(char *)); char *tok = strtok(copy, delim); while (tok) { if (n == cap) arr = realloc(arr, (cap *= 2) * sizeof(char *)); arr[n++] = strdup(tok); tok = strtok(NULL, delim); } free(copy); if (count) *count = n; return arr; } // StrBuilder 實現略...
#include "strutil.h" #includeint main() { char buf[100]; str_copy(buf, sizeof(buf), "Hello"); str_cat(buf, sizeof(buf), " World"); printf("%s\n", buf); // Hello World int cnt; char **parts = str_split("a,b,c", ",", &cnt); for (int i = 0; i < cnt; i++) { printf("[%s]\n", parts[i]); free(parts[i]); } free(parts); return 0; }
extern "C" 保護一個優秀的 C 字符串工具類應提供:安全的緩衝區操作、動態字符串構建器、常用算法封裝、清晰的內存所有權約定。本設計採用「調用者分配/構建器模式」雙軌制,兼顧性能與易用性,可直接集成到項目中作為基礎設施層。