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

C++ 字串完整指南:C 風格字串、字元陣列與 std::string 核心差異

     編輯:C++ 入門

字串處理是 C++ 開發的高頻需求。C++ 同時支援 C 風格字串(以 \0 結尾的字元陣列)、原始字元陣列、與現代 std::string 三種形式。本文系統解析三者核心差異、記憶體佈局、常見操作函式、修改語意陷阱,並建立現代 C++ 字串處理最佳實踐。

三種字串形式對比

形式範例結尾長度計算修改安全性管理方式
C 風格字串char s[] = "hello";自動附加 \0strlen(s)可修改(陣列在堆疊)手動/陣列生命週期
字元陣列char s[] = {'h','e','l','l','o'};無 \0(除非手動加)sizeof(s)可修改手動/陣列生命週期
字串常值char *p = "hello";唯讀區含 \0strlen(p)❌ 修改導致 UB靜態儲存期
std::stringstring s = "hello";內部管理s.size()✅ 安全、自動擴充RAII 自動管理

核心差異實證

sizeof vs strlen


char a[] = "hello";      // sizeof=6 (含\0), strlen=5
char b[] = {'h','e','l','l','o'}; // sizeof=5, strlen=未定義(無\0)
char b2[] = {'h','e','l','l','o','\0'}; // sizeof=6, strlen=5

陣列名 vs 指標修改語意


char s[] = "abc";
char *p = "abc";
s[0] = 'x';  // ✅ 合法:陣列在堆疊,可修改
// p[0] = 'x'; // ❌ 非法:p 指向唯讀常數區

關鍵:陣列名非執行期實體,編譯期分配空間;指標為執行期變數,指向唯讀區導致修改崩潰。

複製語意差異


char *p = "abc";
char *q = p;  // 淺複製:同指向唯讀區

string s1 = "abc";
string s2 = s1; // 深複製:獨立緩衝區,修改互不影響

C 風格字串常用函式

  • strcpy(dst, src)、strncpy:複製
  • strcat(dst, src)、strncat:串接
  • strlen(s):長度(不含 \0)
  • strcmp(s1, s2):比較
  • strlwr/strupr:大小寫轉換(非標準)

現代 C++ 最佳實踐

  1. 預設使用 std::string:自動記憶體管理、邊界檢查、SSO(短字串優化)、豐富介面
  2. 介接 C API 時:str.c_str() 取得 const char*,str.data() 取得非 const 緩衝區(C++17)
  3. 避免手動字元陣列操作:緩衝區溢位、\0 遺漏、淺複製是主要 Bug 來源
  4. 字串格式化:std::format (C++20)、fmt::format、ostringstream 替代 sprintf
  5. 字串視圖:std::string_view (C++17) 避免不必要複製

總結

理解 C 風格字串、字元陣列、字串常值、std::string 的記憶體佈局、修改語意、複製行為差異,是避免緩衝區溢位、懸空指標、資源洩漏的基礎。現代 C++ 專案應全面採用 std::string/string_view,將 C 風格字串限制在介接舊代碼/系統 API 的邊界層。

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