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

C 語言字串操作完整參考手冊:標準庫、記憶體函數、C++ string 進階

     編輯:關於C語言

前言

字串處理是 C/C++ 開發的高頻需求。本文系統整理 <string.h>、<ctype.h> 標準庫函數、記憶體操作函數、常見陷阱,並補充 C++ std::string 核心介面與最佳實踐,提供一站式查閱。

一、<string.h> 核心字串函數分類速查

分類函數用途備註
複製/串接strcpy完整複製目標空間需足夠
strncpy指定長度複製不足補 \0,超長不自動加終結符
strcat串接覆蓋目標尾部 \0
strncat指定長度串接自動補 \0
比較strcmp全長比較返回 <0,=0,>0
strncmp前 n 字元比較
stricmp/strcasecmp忽略大小寫比較非標準但廣泛支援
查找strchr正向找字元含終結符
strrchr反向找字元
strstr找子字串
strpbrk找字元集合中任一字元
長度/轉換strlen字串長度不含 \0
atoi/atol/atof字串→數值無錯誤回報
strtol/strtod字串→數值(健全)支援進制、尾端指標回傳

二、記憶體操作函數(<string.h>)

  • memcpy:非重疊複製,速度最快。
  • memmove:正確處理重疊區塊(內部可能反向複製)。
  • memset:批量填充單一位元組值(常用於結構體清零)。
  • memcmp/memicmp:二進位區塊比較,後者忽略大小寫。
  • memchr:區塊內找字元。

三、字元分類函數(<ctype.h>)

所有函數接受 int(實為 unsigned char 或 EOF),回傳非零表真。常用:isalpha、isdigit、isspace、isalnum、isprint、isxdigit。

四、常見陷阱與安全替代方案

風險函數問題建議替代
strcpy/strcat緩衝區溢位strncpy/strncat、snprintf、strlcpy/strlcat(BSD)
sprintf格式化溢位snprintf
gets極度危險fgets
strtok非執行緒安全、修改原字串strtok_r、strsep、C++ stringstream

五、C++ std::string 進階核心筆記

5.1 非序列容器特性

  • 無 front()/back(),用 operator[0]、operator[size()-1]。
  • 迭代器為 RandomAccessIterator,支援算術運算。

5.2 13 種建構子總覽

預設、複製、移動、string_view、C 字串(含長度)、n*char、迭代器區間、配置器版本等。

5.3 邊界與 npos

  • size_type 為 size_t(無號),npos = static_cast(-1)。
  • 下標越界 未定義行為(不拋出例外),at() 會拋 out_of_range。

5.4 六大比較介面

compare(s2)                    // 整體比較
compare(pos, len, s2)          // 子串比較
compare(pos, len, s2, pos2, len2) // 雙向子串比較
compare(pos, len, cstr)        // 與 C 字串比較
compare(pos, len, cstr, len2)  // 與 C 字串片段比較

回傳 -1/0/1 對應 </=/>。

5.5 修改操作:append/insert/replace/erase 多載全覽

  • append 6 種多載:字串、子串、C 字串、片段、填充、迭代器區間。
  • insert 9 種:位置+字串/子串/C字串/填充/迭代器版本。
  • replace 10 種:位置/迭代器區間 × 來源類型。
  • erase 3 種:位置+長度、單一迭代器、迭代器區間。

5.6 查找家族:find/rfind/find_first_of/find_last_of/find_first_not_of/find_last_not_of

皆回傳 size_type,失敗回 npos。

5.7 子串與 C 字串互轉

  • substr(pos, len) → 新 string。
  • c_str() → const char*(保證以 \0 結尾)。
  • data() → const char*(C++11 起同 c_str())。
  • copy(ptr, len, pos) → 複製到使用者緩衝區(不加 \0)。

5.8 緩衝區管理(類 vector)

  • size()/length()、capacity()、reserve()、resize()、shrink_to_fit() (C++11)。
  • max_size() 受配置器限制。

六、輸入迭代器與串流結尾判斷

istream_iterator 預設建構為「結尾迭代器」,持有空指標。operator== 比較持有的串流指標。串流轉 bool 依賴 operator void* 或 operator!,讀取失敗時轉為 nullptr/true。

結語

C 風格字串函數雖古老但無處不在,掌握其邊界條件(尤其是 strncpy 不自動補 \0)是避免安全漏洞關鍵。C++ std::string 提供豐富且一致的介面,善用 string_view (C++17) 可進一步避免不必要複製。選對工具、守住邊界,字串處理才能又快又穩。

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