首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 字串函數大比拚:strlen vs sizeof、strcat vs strcpy 深度解析

     編輯:關於C語言

四大字串操作函數/運算子的本質區別與避坑指南

初學者最易混淆 strlen/sizeof、strcat/strcpy。本文從編譯期/執行期、參數要求、副作用三維度徹底釐清。

strlen vs sizeof

特性strlen(str)sizeof(str)
性質執行期函數編譯期運算子
計算內容從指標處向後掃描,遇 \0 停止,不含結束符類型佔用位元組數:指標型→指標大小(4/8);陣列型→陣列總大小(含 \0)
參數形式char * 或 char [] 均可同左,但語意截然不同
典型誤區傳入未以 \0 結尾的緩衝區 → 越界讀取對指標用 sizeof 期望得字串長度 → 得指標大小

strcat vs strcpy

共同前提:目的緩衝區 dest 必須可寫(如 char dest[]),且足夠大。

行為strcat(dest, src)strcpy(dest, src)
dest 當前指向 \0接續 src 於末尾覆蓋 dest 為 src
dest 當前非 \0尋找 \0 位置,接續 於其後直接覆蓋 從開頭開始
返回值destdest
典型用途字串拼接字串複製/初始化

實戰防護清單

  1. 永遠確保目的緩衝區足夠大,或改用 strncat/strncpy/snprintf 限制長度
  2. 初始化陣列時:char buf[100] = {0}; 保證首字元為 \0,strcat 才能正確運作
  3. 避免重疊記憶體:strcpy(buf, buf+2) 行為未定義,改用 memmove
  4. 編譯器警告:啟用 -Wstringop-overflow -Wstringop-truncation 捕獲靜態可見溢位

現代替代建議

  • C11 附錄 K:strcpy_s, strcat_s(邊界檢查版)
  • C++:std::string、std::string_view 徹底消除手動管理
  • 安全庫:strlcpy/strlcat (BSD)、snprintf (標準 C)

理解底層機制,才能在不得不寫 C 風格字串時,寫出安全、可維護的代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved