#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 避免手動內存管理。