- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 859字
- 2020-10-30 17:56:37
2.1.5 C++中的字符串
在C++程序中,多字節(jié)字符串和寬字符串都是常見的數(shù)據(jù)類型,但人們也已做出許多努力來創(chuàng)建字符串類。大多數(shù)C++開發(fā)人員都至少寫過一個字符串類,并且字符串類有許多被廣泛接受的形式。C++的標準化[ISO/IEC 1998]促進了標準的類模板std::basic_string的規(guī)定。該basic_string模板代表一個字符序列。它支持序列存取操作也支持字符串操作(如搜索和串連),并且是由字符類型參數(shù)化的:
·string是模板特化basic_string的一個typedef。
·wstring是模板特化basic_string的一個typedef。
因為C++標準定義了額外的字符串類型,所以對于多字節(jié)字符串,C++還定義了額外的形式。一個以空字符結(jié)尾的字節(jié)字符串也稱為NTBS(Null-Terminated Byte String),它是一個字符序列,最高地址的元素定義的內(nèi)容具有值0(即終止空字符),序列中的其他元素都不具有值0。一個以空字符結(jié)尾的多字節(jié)字符串也稱為NTMBS(Null-Terminated Multibyte String),它是一種NTBS,構(gòu)成了一個以初始轉(zhuǎn)換狀態(tài)開始和結(jié)束的有效多字節(jié)字符序列。
與以空字節(jié)結(jié)尾的字符串相比,basic_string的類的模板特化更不容易出現(xiàn)錯誤和安全漏洞。遺憾的是,在C++字符串對象和以空字符結(jié)尾的字節(jié)字符串之間有一個錯配。具體來說,大多數(shù)C++字符串對象都被視為不可分割的整體(通常按值傳遞或按引用傳遞),而現(xiàn)有的C庫函數(shù)都接受指向以空字符結(jié)尾的字符序列的指針。在標準C++的string類中,其內(nèi)部表示并不一定非得是以空字符結(jié)尾的[Stroustrup 1997],雖然所有常見的實現(xiàn)都是以空字符結(jié)尾的。其他一些字符串類型,(例如,Win32 LSA_UNICODE_STRING),也不一定非得是以空字符結(jié)尾的。因此,訪問字符串的內(nèi)容、確定字符串長度,以及判斷一個字符串是否為空有不同的方式。
在C++程序中幾乎不可能避免使用多種字符串類型。如果你想獨占地使用basic_string,你必須確保,目前并無任何下列情況。
·basic_string的字面值。一個如"abc"的字符串字面量是一個以空字符結(jié)尾的靜態(tài)字符串。
·與接受以空字符結(jié)尾的字節(jié)字符串現(xiàn)有庫的交互(例如,在中聲明的函數(shù)簽名操縱的許多對象是NTBS)。
·與接受以空字符結(jié)尾的寬字符串現(xiàn)有庫的交互,(例如,在中聲明的函數(shù)簽名操縱的許多對象是寬字符的序列)。
通常情況下,C++程序使用以空字符結(jié)尾的字節(jié)字符串以及一個string類,雖然在一個遺留代碼庫里往往有必要處理多種字符串類[Wilson 2003]。
- HTML5+CSS3王者歸來
- Mastering Entity Framework Core 2.0
- Intel Galileo Essentials
- OpenShift開發(fā)指南(原書第2版)
- PyTorch自動駕駛視覺感知算法實戰(zhàn)
- Java Web程序設(shè)計
- 老“碼”識途
- Mastering JBoss Enterprise Application Platform 7
- Mastering JavaScript High Performance
- MINECRAFT編程:使用Python語言玩轉(zhuǎn)我的世界
- Orchestrating Docker
- R語言:邁向大數(shù)據(jù)之路(加強版)
- Visual Basic程序設(shè)計全程指南
- Robot Framework Test Automation
- PostgreSQL 12 High Availability Cookbook