| 特性 | strlen | strcpy |
|---|---|---|
| 功能 | 返回字符串長度(不含 \0) | 拷貝字符串(含 \0) |
| 返回值 | size_t 長度 | char* 目的地址 |
| 停止條件 | 遇到 \0 停止計數 | 遇到 \0 停止拷貝(並拷貝 \0) |
| 緩衝區要求 | 無寫入,僅讀取 | 目的緩衝區必須 ≥ 源長度+1 |
char *str = "hello"; // 長度 5,含 \0 共 6 字節
int len = strlen(str); // len = 5
char buf[5]; // ❌ 僅 5 字節,不足存 \0
strcpy(buf, str); // 寫入 6 字節 → 緩衝區溢出,未定義行為
// 正確做法:
char buf2[6]; // 或 sizeof("hello") = 6
char *buf3 = new char[strlen(str) + 1];
dst = new char[strlen(src) + 1];char buf[sizeof("hello")]; 自動包含 \0。strncpy(需手動補 \0)、strcpy_s (C11/MSVC)、std::string(C++ 首選)。size_t strlen(const char *s) {
size_t len = 0;
while (*s++) ++len;
return len;
}
char *strcpy(char *dst, const char *src) {
char *ret = dst;
while ((*dst++ = *src++)); // 賦值同時檢查 \0
return ret;
}
理解「是否包含 \0」是區分兩者行為的根本,也是 C 字符串操作最常見的坑點之一。