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

C語言 strcpy 函數用法詳解:字符串複製與安全替代方案

     編輯:關於C語言

基本語法

#include <string.h>
char *strcpy(char *dest, const char *src);

將 src 指向的字符串(含結束符 \0)複製到 dest,返回目標地址 dest。

使用示例

#include <string.h>
#include <iostream.h>  // 老式頭文件,現代用 

int main() {
    char a[20];
    char c[] = "i am a teacher!";
    strcpy(a, c);
    cout << a << endl;  // 輸出: i am a teacher!
    return 0;
}

關鍵注意事項

  • 緩衝區溢出風險:dest 必須有足夠空間容納 src(含 \0),否則導致未定義行為
  • 內存重疊未定義:源目重疊時行為未定義,需用 memmove
  • 無長度檢查:不檢查目標緩衝區大小

安全替代方案

函數標準特點
strncpy(dest, src, n)C89最多複製 n 字符,不足補 \0,但可能不以 \0 結尾
strlcpy(dest, src, size)BSD/非標準保證 \0 結尾,返回源長度,廣泛可用
strcpy_s(dest, destsz, src)C11 Annex K檢查緩衝區大小,失敗返回錯誤碼
snprintf(dest, size, "%s", src)C99通用格式化,自動保證 \0 結尾

現代最佳實踐

// C11 安全版本
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>

char dest[20];
strcpy_s(dest, sizeof(dest), "Hello");  // 返回 0 表示成功

// 跨平台通用:snprintf
snprintf(dest, sizeof(dest), "%s", "Hello");

常見錯誤示例

// 錯誤:字符串字面量不可修改
char *p = "hello";
strcpy(p, "world"); // 崩潰!

// 正確:使用數組或動態分配
char arr[20];
strcpy(arr, "world"); // OK

// 錯誤:目標空間不足
char small[5];
strcpy(small, "too long string"); // 緩衝區溢出

// 正確:使用 strncpy 或 snprintf
snprintf(small, sizeof(small), "%s", "truncated");

總結

strcpy 簡單但危險。現代代碼應優先使用 snprintf(跨平台)或 strcpy_s(C11),並始終確保目標緩衝區大小充足。C++ 推薦直接使用 std::string 避免手動內存管理。

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