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

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

主站蜘蛛池模板: 盐山县| 惠东县| 哈巴河县| 中山市| 大田县| 合阳县| 德惠市| 阿巴嘎旗| 衡山县| 喀什市| 始兴县| 白沙| 武夷山市| 连江县| 同德县| 太仓市| 通道| 商水县| 屯门区| 吉首市| 垦利县| 湟中县| 固原市| 天津市| 新巴尔虎左旗| 于田县| 车险| 左云县| 庆安县| 梨树县| 勃利县| 通道| 高清| 宁阳县| 惠州市| 若羌县| 大田县| 公主岭市| 扶绥县| 武冈市| 连云港市|