#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"); // 截斷但不崩潰