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

C 語言 strcpy 函數用法詳解與安全替代方案

     編輯:關於C

函數原型


#include 
char *strcpy(char *dest, const char *src);

功能

將 `src` 指向的以 `\0` 結束的字符串**完整複製**到 `dest` 指向的緩衝區,包含結束符 `\0`。返回目標地址 `dest`。

基本用法示例


#include 
#include 

int main() {
    char a[20];
    char c[] = "i am a teacher!";
    strcpy(a, c);  // 複製
    printf("%s\n", a);  // 輸出: i am a teacher!
    return 0;
}

⚠️ 關鍵風險:緩衝區溢出

`strcpy` **不檢查目標緩衝區大小**,若 `src` 長度 ≥ `dest` 容量,會覆蓋相鄰內存,導致程序崩潰或安全漏洞(經典 CWE-120)。


char buf[8];
strcpy(buf, "123456789");  // 危險!寫入 10 字節(含\0)到 8 字節緩衝區

安全替代方案

函數標準特點
strncpy(dest, src, n)C89最多複製 n 字符,**不保證**以 `\0` 結尾(若 src 長度 ≥ n),需手動 `dest[n-1]='\0'`
strcpy_s(dest, destsz, src)C11 (Annex K) / MSVC檢查目標大小,溢出時調用約束處理函數,**推薦 Windows/MSVC 環境**
strlcpy(dest, src, size)BSD / Linux (非標準)總是 `\0` 結尾,返回 src 長度,便於檢測截斷,**推薦 Unix-like 環境**
snprintf(dest, size, "%s", src)C99通用、安全、標準,**跨平台首選**

最佳實踐代碼模板


// 跨平台安全複製:優先 snprintf
void safe_strcpy(char *dest, size_t dest_size, const char *src) {
    if (dest && dest_size > 0) {
        snprintf(dest, dest_size, "%s", src);
    }
}

// 使用示例
char buf[20];
safe_strcpy(buf, sizeof(buf), "Hello World");  // 安全
safe_strcpy(buf, sizeof(buf), "This string is way too long for the buffer"); // 截斷但不崩潰

總結

  • `strcpy` 簡單但危險,**生產代碼嚴禁直接使用**。
  • 新代碼統一用 `snprintf(dest, sizeof(dest), "%s", src)` 或封裝的 `safe_strcpy`。
  • 編譯器開啟 `-Wstringop-overflow` (GCC/Clang) 或 `/analyze` (MSVC) 靜態檢測。
  • 現代 C++ 推薦使用 `std::string`、`std::string_view` 完全避免手動內存管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved