首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 從現有字符串提取前 N 字符構造 std::string 最簡潔寫法

     編輯:程式設計綜合問答

最簡潔標準寫法 (C++11 起)

char *p = ...; // 既有字符串,長度 ≥ 100
std::string s(p, 20);  // 直接用 (指針, 長度) 構造函數,零拷貝 (SSO 除外)

**優點**:單行、無手動內存管理、異常安全、編譯器優化 (SSO 短字串無堆分配)。

其他常見場景對比

場景代碼說明
char[] 數組`char buf[100]; std::string s(buf, 20);`同樣適用
只知道結尾指針`std::string s(p, p + 20);`迭代器範圍構造
需保留原指針 const`const char* cp = p; std::string s(cp, 20);`const 正確性
C++17 string_view (零拷貝視圖)`std::string_view sv(p, 20);`不持有內存,僅引用,極快
舊式 C 風格 (不推薦)`char *np = new char[21]; strncpy(np, p, 20); np[20]='\0'; std::string s(np); delete[] np;`手動管理、易漏洞、多分配

關鍵點提醒

  • `std::string` 構造函數 **不要求以 `\0` 結尾**,長度由參數決定,完美支援二進制數據/嵌入 `\0`
  • 若 `p` 可能為 `nullptr`,**必須先判空**,否則 UB
  • 若需 **修改原緩衝區** 且不想拷貝,C++20 可用 `std::string::resize_and_overwrite` (進階)

總結

**`std::string s(ptr, len)` 是現代 C++ 最簡潔、安全、高效的標準寫法**。拒絕 `new`/`strncpy`/`malloc` 手動內存管理。

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