strcpy 是 C 標準庫 <string.h> 中的字串複製函數,用於將來源字串(包含結束符 '\0')完整複製到目標記憶體區域。其函數原型為:
char *strcpy(char *strDest, const char *strSrc);
參數說明:
strDest:目標字串指標,必須指向足夠大的已配置記憶體空間。strSrc:來源字串指標,內容不會被修改。返回值: 返回 strDest,方便鏈式呼叫。
sizeof 用於計算資料類型或變數佔用的記憶體位元組數(編譯期決定)。對於陣列,返回整個陣列大小;對於指標,返回指標本身大小(通常 4 或 8 位元組)。
strlen 計算字串實際長度(不含結束符 '\0'),需在執行期遍歷字串。
#include <stdio.h>
#include <string.h>
int main(void) {
const char source[10] = "ni hao a!";
char dest[20];
strcpy(dest, source);
puts(dest);
printf("sizeof(source) = %zu\n", sizeof(source));
printf("sizeof(dest) = %zu\n", sizeof(dest));
printf("strlen(dest) = %zu\n", strlen(dest));
for (int i = 0; i < 20; i++)
printf("%c", dest[i]);
puts("\n");
return 0;
}
ni hao a!
sizeof(source) = 10
sizeof(dest) = 20
strlen(dest) = 9
ni hao a! 燙燙燙燙燙
重點觀察:
sizeof(source) 為 10,包含 9 個字元 + 1 個結束符。sizeof(dest) 為 20,反映陣列宣告大小,非實際字串長度。strlen(dest) 為 9,僅計算有效字元。char *strcpy(char *strDest, const char *strSrc) {
if (strDest == NULL || strSrc == NULL)
return NULL;
if (strDest == strSrc)
return strDest;
char *tempPtr = strDest;
while ((*strDest++ = *strSrc++) != '\0');
return tempPtr;
}
實作要點:
strcpy 不檢查目標緩衝區大小,若來源字串過長會導致緩衝區溢位。現代開發建議使用 strncpy、strcpy_s (C11) 或 snprintf 等安全替代方案。