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

C 庫函數 strcpy 實現陷阱與多種正確寫法

     編輯:關於C語言

常見錯誤:漏掉結束符 \0

char *strcpy(char *to, const char *from) {
    char *save = to;
    while (*from) {
        *save = *from;
        ++save; ++from;
    }
    return to; // 缺少 *save = '\0',導致輸出亂碼
}

運行結果:hello,world!"(後跟隨機垃圾字符)。

修正方案(任選其一)

方案 A:循環條件賦值並檢查

while ((*save = *from)) { ++save; ++from; }

方案 B:循環後顯式添加

while (*from) { *save = *from; ++save; ++from; }
*save = '\0';

標準庫級實現(三種經典寫法)

1. for 循環緊湊版

char *strcpy(char *to, const char *from) {
    char *save = to;
    for (; (*to = *from) != '\0'; ++from, ++to);
    return save;
}

2. 數組下標版

char *strcpy1(char *to, const char *from) {
    int i;
    for (i = 0; (to[i] = from[i]); ++i);
    return to;
}

3. 後置遞增指針版(最經典)

char *strcpy2(char *to, const char *from) {
    char *save = to;
    while ((*to++ = *from++) != '\0');
    return save;
}

核心要點總結

  1. 必須複製結束符:\0 是 C 字符串的邊界標記,缺之則所有字符串函數(printf、strlen、strcat…)失效。
  2. 返回目標起始地址:鏈式調用慣例(如 strcat(strcpy(dest, src), "tail"))。
  3. 目標緩衝區需足夠大:strcpy 不檢查邊界,生產代碼首選 strncpy、strlcpy 或 C++ std::string。
  4. 重疊內存未定義:源目重疊行為未定義,需用 memmove。

測試驗證

int main() {
    char c[20];
    char *s = "hello,world!";
    strcpy(c, s);
    printf("%s\n", c); // 正確輸出 hello,world!
    return 0;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved