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

C語言字符串操作工具類設計:從頭文件到完整實現

     編輯:關於C語言

設計目標

封裝常用字符串操作(複製、拼接、比較、查找、分割、大小寫轉換等),提供統一、安全、可復用的 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"
#include 

int 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;
}

設計原則總結

  1. 安全第一: 所有寫入操作必須帶目標緩衝區大小參數
  2. 所有權清晰: 動態分配的內存文檔標註「調用者負責釋放」
  3. 錯誤處理: 返回錯誤碼或 NULL,不直接 abort()
  4. C++ 兼容: 使用 extern "C" 保護
  5. 零依賴: 僅依賴標準庫,便於嵌入式項目移植

總結

一個優秀的 C 字符串工具類應提供:安全的緩衝區操作、動態字符串構建器、常用算法封裝、清晰的內存所有權約定。本設計採用「調用者分配/構建器模式」雙軌制,兼顧性能與易用性,可直接集成到項目中作為基礎設施層。

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