官术网_书友最值得收藏!

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]。

主站蜘蛛池模板: 普兰店市| 军事| 九龙县| 寿阳县| 板桥市| 洛隆县| 开封市| 巴彦县| 邮箱| 贵阳市| 古田县| 龙川县| 宜兴市| 五台县| 盐亭县| 崇仁县| 灵武市| 铜陵市| 兰州市| 四平市| 丰顺县| 宜良县| 新营市| 林甸县| 修水县| 涡阳县| 西乌珠穆沁旗| 洛南县| 浦东新区| 博爱县| 东莞市| 宣恩县| 池州市| 宝山区| 临城县| 富川| 固原市| 禄劝| 墨脱县| 大姚县| 柳州市|