初學者最易混淆 strlen/sizeof、strcat/strcpy。本文從編譯期/執行期、參數要求、副作用三維度徹底釐清。
| 特性 | strlen(str) | sizeof(str) |
|---|---|---|
| 性質 | 執行期函數 | 編譯期運算子 |
| 計算內容 | 從指標處向後掃描,遇 \0 停止,不含結束符 | 類型佔用位元組數:指標型→指標大小(4/8);陣列型→陣列總大小(含 \0) |
| 參數形式 | char * 或 char [] 均可 | 同左,但語意截然不同 |
| 典型誤區 | 傳入未以 \0 結尾的緩衝區 → 越界讀取 | 對指標用 sizeof 期望得字串長度 → 得指標大小 |
共同前提:目的緩衝區 dest 必須可寫(如 char dest[]),且足夠大。
| 行為 | strcat(dest, src) | strcpy(dest, src) |
|---|---|---|
dest 當前指向 \0 | 接續 src 於末尾 | 覆蓋 dest 為 src |
dest 當前非 \0 | 尋找 \0 位置,接續 於其後 | 直接覆蓋 從開頭開始 |
| 返回值 | dest | dest |
| 典型用途 | 字串拼接 | 字串複製/初始化 |
strncat/strncpy/snprintf 限制長度char buf[100] = {0}; 保證首字元為 \0,strcat 才能正確運作strcpy(buf, buf+2) 行為未定義,改用 memmove-Wstringop-overflow -Wstringop-truncation 捕獲靜態可見溢位strcpy_s, strcat_s(邊界檢查版)std::string、std::string_view 徹底消除手動管理strlcpy/strlcat (BSD)、snprintf (標準 C)理解底層機制,才能在不得不寫 C 風格字串時,寫出安全、可維護的代碼。