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

C 語言字串複製實作:從簡易 strcpy 到標準 memcpy 的演進與覆蓋問題

     編輯:關於C語言

C 語言字串複製實作:從簡易 strcpy 到標準 memcpy 的演進與覆蓋問題

1. 手寫 strcpy 兩種寫法

// 版本一:for 迴圈
void my_strcpy1(char *dst, const char *src) {
    for (; *src; ++src, ++dst) *dst = *src;
    *dst = '\0';
}

// 版本二:while 精簡版 (K&R 風格)
void my_strcpy2(char *dst, const char *src) {
    while (*dst++ = *src++); // 賦值結果為字元值,\0 為 0 結束迴圈
}

2. memcpy:萬用記憶體複製

void *my_memcpy(void *dst, const void *src, size_t n) {
    char *d = dst; const char *s = src;
    while (n--) *d++ = *s++;
    return dst;
}
  • 第三參數指定位元組數,不依賴 \0。
  • 可複製任意型別資料 (結構體、整數陣列等)。
  • void* 參數/返回,型別通用。

3. 記憶體重疊問題與 memmove

若 src 在 dst 範圍內,正向複製會覆蓋未讀資料。

void *my_memmove(void *dst, const void *src, size_t n) {
    char *d = dst; const char *s = src;
    if (d < s) { // 目的地在前,正向複製安全
        while (n--) *d++ = *s++;
    } else if (d > s) { // 目的地在後,需逆向複製
        d += n; s += n;
        while (n--) *--d = *--s;
    }
    return dst;
}

標準庫使用建議

  • 字串複製:strcpy/strncpy (注意 strncpy 不保證結尾 \0)。
  • 已知長度/二進位資料:memcpy。
  • 可能重疊:memmove (標準庫保證正確處理)。
  • C11 strcpy_s/memcpy_s 提供邊界檢查。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved