- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 859字
- 2020-10-30 17:56:37
2.1.5 C++中的字符串
在C++程序中,多字節字符串和寬字符串都是常見的數據類型,但人們也已做出許多努力來創建字符串類。大多數C++開發人員都至少寫過一個字符串類,并且字符串類有許多被廣泛接受的形式。C++的標準化[ISO/IEC 1998]促進了標準的類模板std::basic_string的規定。該basic_string模板代表一個字符序列。它支持序列存取操作也支持字符串操作(如搜索和串連),并且是由字符類型參數化的:
·string是模板特化basic_string的一個typedef。
·wstring是模板特化basic_string的一個typedef。
因為C++標準定義了額外的字符串類型,所以對于多字節字符串,C++還定義了額外的形式。一個以空字符結尾的字節字符串也稱為NTBS(Null-Terminated Byte String),它是一個字符序列,最高地址的元素定義的內容具有值0(即終止空字符),序列中的其他元素都不具有值0。一個以空字符結尾的多字節字符串也稱為NTMBS(Null-Terminated Multibyte String),它是一種NTBS,構成了一個以初始轉換狀態開始和結束的有效多字節字符序列。
與以空字節結尾的字符串相比,basic_string的類的模板特化更不容易出現錯誤和安全漏洞。遺憾的是,在C++字符串對象和以空字符結尾的字節字符串之間有一個錯配。具體來說,大多數C++字符串對象都被視為不可分割的整體(通常按值傳遞或按引用傳遞),而現有的C庫函數都接受指向以空字符結尾的字符序列的指針。在標準C++的string類中,其內部表示并不一定非得是以空字符結尾的[Stroustrup 1997],雖然所有常見的實現都是以空字符結尾的。其他一些字符串類型,(例如,Win32 LSA_UNICODE_STRING),也不一定非得是以空字符結尾的。因此,訪問字符串的內容、確定字符串長度,以及判斷一個字符串是否為空有不同的方式。
在C++程序中幾乎不可能避免使用多種字符串類型。如果你想獨占地使用basic_string,你必須確保,目前并無任何下列情況。
·basic_string的字面值。一個如"abc"的字符串字面量是一個以空字符結尾的靜態字符串。
·與接受以空字符結尾的字節字符串現有庫的交互(例如,在中聲明的函數簽名操縱的許多對象是NTBS)。
·與接受以空字符結尾的寬字符串現有庫的交互,(例如,在中聲明的函數簽名操縱的許多對象是寬字符的序列)。
通常情況下,C++程序使用以空字符結尾的字節字符串以及一個string類,雖然在一個遺留代碼庫里往往有必要處理多種字符串類[Wilson 2003]。
- Oracle從入門到精通(第3版)
- ClickHouse性能之巔:從架構設計解讀性能之謎
- PostgreSQL for Data Architects
- iOS 9 Game Development Essentials
- 程序員面試算法寶典
- Building Mapping Applications with QGIS
- 零基礎學Java程序設計
- Getting Started with LLVM Core Libraries
- TMS320LF240x芯片原理、設計及應用
- Scala編程實戰
- 物聯網系統架構設計與邊緣計算(原書第2版)
- HTML5移動Web開發
- Learning Cocos2d-JS Game Development
- SAS編程演義
- Joomla!Search Engine Optimization