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

C 標準庫字串處理函數精要:memcpy、memmove、atoi、strstr 實現與避坑

     編輯:關於C語言

C 標準庫字串處理函數精要:memcpy、memmove、atoi、strstr 實現與避坑

字串/記憶體操作是 C 程式核心技能,標準庫函數隱藏諸多細節 (重疊處理、邊界檢查、錯誤返回)。本文解析四大高頻函數規格、自製實現與最佳實踐。

1. memcpy:非重疊記憶體複製

void *memcpy(void *dest, const void *src, size_t n);
  • 複製 n 字節,**不檢查 '\\0'**,二進制安全。
  • 行為未定義:dest 與 src 記憶體區域重疊。
  • 返回 dest 支援鏈式呼叫。

自製實現

void *my_memcpy(void *dest, const void *src, size_t n) {
    if (!dest || !src) return NULL;
    char *d = dest; const char *s = src;
    for (size_t i = 0; i < n; i++) d[i] = s[i];
    return dest;
}

2. memmove:安全處理重疊

void *memmove(void *dest, const void *src, size_t n);
  • 語義同 memcpy,但**保證重疊時正確** (內部自動判斷方向複製)。
  • 效率略低於 memcpy (需檢查/反向複製)。
  • 實現技巧:dest < src 正向複製;dest > src 反向複製 (從尾部開始)。

3. atoi:字串轉整數 (簡易版)

int atoi(const char *nptr);
  • 跳過前導空白,遇數字/正負號開始轉換,非數字停止。
  • 無錯誤報告:溢出、無效輸入皆返回 0 (無法區分 "0" 與錯誤)。
  • 等價於 strtol(nptr, NULL, 10)。

健壯實現 (支援溢出檢測)

int my_atoi(const char *str) {
    int sign = 1, base = 0, i = 0;
    while (str[i] == ' ') i++;
    if (str[i] == '-' || str[i] == '+') sign = 1 - 2*(str[i++]=='-');
    while (str[i] >= '0' && str[i] <= '9') {
        if (base > INT_MAX/10 || (base==INT_MAX/10 && str[i]-'0' > 7))
            return sign==1 ? INT_MAX : INT_MIN;
        base = 10*base + (str[i++]-'0');
    }
    return base * sign;
}

4. strstr:子字串搜尋

char *strstr(const char *haystack, const char *needle);
  • 返回 haystack 中首次出現 needle 的位址,找不到返回 NULL。
  • 空 needle 返回 haystack。
  • 演算法:暴力 O(n*m)、KMP O(n+m)、Boyer-Moore (標準庫常用優化版)。

暴力法實現

char *my_strstr(const char *h, const char *n) {
    if (!*n) return (char*)h;
    for (size_t i = 0; h[i]; i++) {
        size_t j = 0;
        while (h[i+j] == n[j]) {
            if (!n[++j]) return (char*)(h+i);
        }
    }
    return NULL;
}

避坑指南

函數常見錯誤正確做法
memcpy重疊區域複製 (如 memcpy(buf+2, buf, 10))改用 memmove
atoi不檢查錯誤,"abc" 返回 0 假以為成功用 strtol/strtoll 檢查 endptr 與 errno
strstr未檢查 NULL 直接解參考if (p) { ... }
所有緩衝區溢出 (目標空間不足)確保 dest 容量 ≥ n
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved