之是以抛棄char*的字元串而選用c++标準程式庫中的string類,是因為他和前者比較起來,不必擔心記憶體是否足夠、字元串長度等等,而且作為一個類出現,他內建的操作函數足以完成我們大多數情況下(甚至是100%)的需要。我們可以用 = 進行指派操作,== 進行比較,+ 做串聯(是不是很簡單?)。我們盡可以把它看成是c++的基本資料類型。
mfc中的cstring類使用起來真的非常的友善好用。但是如果離開了mfc架構,還有沒有這樣使用起來非常友善的類呢?答案是肯定的。也許有人會說,即使不用mfc架構,也可以想辦法使用mfc中的api,具體的操作方法在本文最後給出操作方法。其實,可能很多人很可能會忽略掉标準c++中string類的使用。标準c++中提供的string類得功能也是非常強大的,一般都能滿足我們開發項目時使用。
要想使用标準c++中string類,必須要包含
下面你就可以使用string/wstring了,它們兩分别對應着char和wchar_t。
string和wstring的用法是一樣的,以下隻用string作介紹:
string類的構造函數:
string類的字元操作:
string的特性描述:
string類的輸入輸出操作:
string的指派:
string的連接配接:
string的比較:
string的子串:
string的交換:
string類的查找函數:
string類的替換函數:
string類的插入函數:
string類的删除函數
string類的疊代器處理:
字元串流處理:
通過定義ostringstream和istringstream變量實作,#include <sstream>頭檔案中
以上就是對c++ string類的一個簡要介紹
1.聲明一個c++字元串
聲明一個字元串變量很簡單:
這樣我們就聲明了一個字元串變量,但既然是一個類,就有構造函數和析構函數。上面的聲明沒有傳入參數,是以就直接使用了string的預設的構造函數,這個函數所作的就是把str初始化為一個空字元串。
string類的構造函數和析構函數如下:
測試如下:
2.字元串操作函數
這裡是c++字元串的重點,我先把各種操作函數羅列出來,不喜歡把所有函數都看完的人可以在這裡找自己喜歡的函數,再到後面看他的詳細解釋。
下面詳細介紹:
2.1 c++字元串和c字元串的轉換
c ++提供的由c++字元串得到對應的c_string的方法是使用data()、c_str()和copy(),其中,data()以字元數組的形式傳回字元串内容,但并不添加’\0’。c_str()傳回一個以‘\0’結尾的字元數組,而copy()則把字元串的内容複制或寫入既有的c_string或字元數組内。c++字元串并不以’\0’結尾。我的建議是在程式中能使用c++字元串就使用,除非萬不得已不選用c_string。由于隻是簡單介紹,詳細介紹掠過,誰想進一步了解使用中的注意事項可以給我留言(到我的收件箱)。我詳細解釋。
2.2 大小和容量函數
一個c++字元串存在三種大小:a)現有的字元數,函數是size()和length(),他們等效。empty()用來檢查字元串是否為空。b)max_size() 這個大小是指目前c++字元串最多能包含的字元數,很可能和機器本身的限制或者字元串所在位置連續記憶體的大小有關系。我們一般情況下不用關心他,應該大小足夠我們用的。但是不夠用的話,會抛出length_error異常c)capacity()重新配置設定記憶體之前 string所能包含的最大字元數。這裡另一個需要指出的是reserve()函數,這個函數為string重新配置設定記憶體。重新配置設定的大小由其參數決定,預設參數為0,這時候會對string進行非強制性縮減。
還有必要再重複一下c++字元串和c字元串轉換的問題,許多人會遇到這樣的問題,自己做的程式要調用别人的函數、類什麼的(比如資料庫連接配接函數connect(char*,char*)),但别人的函數參數用的是char*形式的,而我們知道,c_str()、data()傳回的字元數組由該字元串擁有,是以是一種const char*,要想作為上面提及的函數的參數,還必須拷貝到一個char*,而我們的原則是能不使用c字元串就不使用。那麼,這時候我們的處理方式是:如果此函數對參數(也就是char*)的内容不修改的話,我們可以這樣connect((char*)userid.c_str(),
(char*)passwd.c_str()),但是這時候是存在危險的,因為這樣轉換後的字元串其實是可以修改的(有興趣地可以自己試一試),是以我強調除非函數調用的時候不對參數進行修改,否則必須拷貝到一個char*上去。當然,更穩妥的辦法是無論什麼情況都拷貝到一個char*上去。同時我們也祈禱現在仍然使用c字元串進行程式設計的高手們(說他們是高手一點兒也不為過,也許在我們還穿開裆褲的時候他們就開始程式設計了,哈哈…)寫的函數都比較規範,那樣我們就不必進行強制轉換了。
2.3 元素存取
我們可以使用下标操作符[]和函數at()對元素包含的字元進行通路。但是應該注意的是操作符[]并不檢查索引是否有效(有效索引0~str.length()),如果索引失效,會引起未定義的行為。而at()會檢查,如果使用 at()的時候索引無效,會抛出out_of_range異常。
有一個例外不得不說,const string a;的操作符[]對索引值是a.length()仍然有效,其傳回值是’\0’。其他的各種情況,a.length()索引都是無效的。舉例如下:
不贊成類似于下面的引用或指針指派:
因為一旦發生重新配置設定,r,p立即失效。避免的方法就是不使用。
2.4 比較函數
c ++字元串支援常見的比較操作符(>,>=,<,<=,==,!=),甚至支援string與c-string的比較(如 str<”hello”)。在使用>,>=,<,<=這些操作符的時候是根據“目前字元特性”将字元按字典順序進行逐一得比較。字典排序靠前的字元小,比較的順序是從前向後比較,遇到不相等的字元就按這個位置上的兩個字元的比較結果确定兩個字元串的大小。同時,string (“aaaa”) <string(aaaaa)。
另一個功能強大的比較函數是成員函數compare()。他支援多參數處理,支援用索引值和長度定位子串來進行比較。他傳回一個整數來表示比較結果,傳回值意義如下:0-相等〉0-大于 <0-小于。舉例如下:
也可以使用stl的比較算法。
2.5 更改内容
這在字元串的操作中占了很大一部分。
首先講指派,第一個指派方法當然是使用操作符=,新值可以是string(如:s=ns) 、c_string(如:s=”gaint”)甚至單一字元(如:s=’j’)。還可以使用成員函數assign(),這個成員函數可以使你更靈活的對字元串指派。還是舉例說明吧:
把字元串清空的方法有三個:s=””;s.clear();s.erase();(我越來越覺得舉例比說話讓别人容易懂!)。
string提供了很多函數用于插入(insert)、删除(erase)、替換(replace)、增加字元。
先說增加字元(這裡說的增加是在尾巴上),函數有 +=、append()、push_back()。舉例如下:
也許你需要在string中間的某個位置插入字元串,這時候你可以用insert()函數,這個函數需要你指定一個安插位置的索引,被插入的字元串将放在這個索引的後面。
這種形式的insert()函數不支援傳入單個字元,這時的單個字元必須寫成字元串形式(讓人惡心)。既然你覺得惡心,那就不得不繼續讀下面一段話:為了插入單個字元,insert()函數提供了兩個對插入單個字元操作的重載函數:insert(size_type index,size_type num,chart c)和insert(iterator pos,size_type num,chart c)。其中size_type是無符号整數,iterator是char*,是以,你這麼調用insert函數是不行的:insert(0,1,
’j’);這時候第一個參數将轉換成哪一個呢?是以你必須這麼寫:insert((string::size_type)0,1,’j’)!第二種形式指出了使用疊代器安插字元的形式,在後面會提及。順便提一下,string有很多操作是使用stl的疊代器的,他也盡量做得和stl靠近。
删除函數erase()的形式也有好幾種(真煩!),替換函數replace()也有好幾個。舉例吧:
2.6提取子串和字元串連接配接
題取子串的函數是:substr(),形式如下:
2.7輸入輸出操作
1.>> 從輸入流讀取一個string。
2.<< 把一個string寫入輸出流。
另一個函數就是getline(),他從輸入流讀取一行内容,直到遇到分行符或到了檔案尾。
2.8搜尋與查找
查找函數很多,功能也很強大,包括了:
這些函數傳回符合搜尋條件的字元區間内的第一個字元的索引,沒找到目标就傳回npos。所有的函數的參數說明如下:
第一個參數是被搜尋的對象。第二個參數(可有可無)指出string内的搜尋起點索引,第三個參數(可有可無)指出搜尋的字元個數。比較簡單,不多說不了解的可以向我提出,我再仔細的解答。當然,更加強大的stl搜尋在後面會有提及。
最後再說說npos的含義,string::npos的類型是string::size_type,是以,一旦需要把一個索引與npos相比,這個索引值必須是string::size_type類型的,更多的情況下,我們可以直接把函數和npos進行比較(如:if(s.find(“jia”)== string::npos))。
begin() end() //提供類似stl的疊代器支援
rbegin() rend() //逆向疊代器
get_allocator() //傳回配置器
一、char_traits 字元特征類
1)意義:包裝特定串元素的通用行為界面,以便容器實作時依據特征資訊而執行特定行為
2)定義了通用類型名
其中 int_type 表示字元元素轉換到特定編碼時的整型表示,pos_type, off_type 分别作為字元串索引和字元串元素偏移的類型,類似容器疊中的指針,疊代類型和指針,疊代器的偏移類型。最後的 state_type 用于存儲流狀态,如出錯,格式控制等等。
3)定義了字元 / 字元串操作的包裝界面,以便通用算法的調用
4)int_type 類型應是目前字元類型的整型編碼
二、std::string 并不是序列容器,沒有 front() 和 back() 界面用于取出前端和尾端的元素,使用 std::string::operator [] 并傳遞 streampos 類型取得特定元素,如 std::string::size() - 1 作為索引取得最後一個字元
三、basic_string 支援的初始化
字元到串不能初始化,但支援 operator = 指派和 operator += 累加指派運算。
四、字元串的區間有效性
對串的索引通路在超過字元串的有效區間時,因為串的在實作上對内置的字元緩沖區執行下标通路,是以不會導緻異常,但是将得到不可預知的結果,通常是不可用的。
将其他字元串作為右值輸入時,對該串取出計數大于串大小時按串大小計算。
std::basic_string::size_type 的實際類型為 size_t,在 visual c++ 7.1 中實作為 unsigned,std::basic_string::npos 被靜态設定為
(basic_string<_elem, _traits, _alloc>::size_type)(-1);
在查找子字元串等操作時,函數傳回 npos 的值表示非法索引。
五、比較字元串
允許的比較對象
傳回 -1, 0, 1 作為小于、等于和大于的比較結果。
六、附加資料
七、查找、替換和清除
八、取出字元串
九、字元串的緩沖區管理
十、定義輸入疊代器的尾端
向 istream_iterator 傳遞輸入流對象以建立輸入疊代器,輸入疊代器持有輸入流對象的指針,預設建立和讀取流失敗的情況下該指針被設定為 0。并且在實作輸入疊代器間的 operator == 相等運算時,進行持有的流對象指針的相等比較,這樣,預設建立的輸入疊代器将被用于比對輸入流的結束。
* 當輸入流讀取失敗,使用者執行 if, while 條件判斷時,實際上先将判斷值轉換成 void* 類型,或者根據 operator ! 運算符的傳回結果,對輸入流重載 operator void* 和 operator ! 運算符,可以定義輸入流在布爾表達式中的行為,使得當流讀取失敗的情況下,輸入疊代器可以通過布爾表達式來确認,而不是顯式通路 fail() 成員函數.
1)字元串操作
2)字元串到數值類型的轉換
3)字元檢查
4)函數原型
原型:char * strcpy ( char * destination, const char * source )
功能:将字元串source拷貝到字元串destination中
第二個字元串将覆寫掉第一個字元串的所有内容!
注意:在定義數組時,字元數組1的字元串長度必須大于或等于字元串2的字元串長度。不能用指派語句将一個字元串常量或字元數組直接賦給一個字元數組。所有字元串處理函數都包含在頭檔案string.h中。
原型:char * strncpy ( char * destination, const char * source, size_t num );
功能:将字元串source中前num個字元拷貝到字元串destination中
原型:char * strcat ( char * destination, const char * source );
功能:将字元串source接到字元串destination的後面
原型:char * strncat ( char * destination, const char * source, size_t num );
功能:将字元串source的前num個字元接到字元串destination的後面
原型:int strcmp(const char * firststring, const char * secondstring);
功能:比較兩個字元串firststring和secondstring
原型:size_t strlen ( const char * str );
功能:統計字元串 str 中字元的個數
void *memset(void *dest, int c, size_t count);
将dest前面count個字元置為字元c. 傳回dest的值.
void *memmove(void *dest, const void *src, size_t count);
從src複制count位元組的字元到dest. 如果src和dest出現重疊, 函數會自動處理. 傳回dest的值.
void *memcpy(void *dest, const void *src, size_t count);
從src複制count位元組的字元到dest. 與memmove功能一樣, 隻是不能處理src和dest出現重疊. 傳回dest的值.
const void * memchr ( const void * buf, int c, size_t count);
void * memchr ( void * buf, int c, size_t count );
在buf前面count位元組中查找首次出現字元c的位置. 找到了字元c或者已經搜尋了count個位元組, 查找即停止. 操作成功則傳回buf中首次出現c的位置指針, 否則傳回null.
void *_memccpy(void *dest, const void *src, int c, size_t count);
從src複制0個或多個位元組的字元到dest. 當字元c被複制或者count個字元被複制時, 複制停止.
如果字元c被複制, 函數傳回這個字元後面緊挨一個字元位置的指針. 否則傳回null.
int memcmp(const void *buf1, const void *buf2, size_t count);
比較buf1和buf2前面count個位元組大小.
傳回值< 0, 表示buf1小于buf2;
傳回值為0, 表示buf1等于buf2;
傳回值> 0, 表示buf1大于buf2.
int memicmp(const void *buf1, const void *buf2, size_t count);
比較buf1和buf2前面count個位元組. 與memcmp不同的是, 它不區分大小寫. 傳回值同上.
char *strrev(char *string);
将字元串string中的字元順序颠倒過來. null結束符位置不變. 傳回調整後的字元串的指針.
char *_strupr(char *string);
将string中所有小寫字母替換成相應的大寫字母, 其它字元保持不變. 傳回調整後的字元串的指針.
char *_strlwr(char *string);
将string中所有大寫字母替換成相應的小寫字母, 其它字元保持不變. 傳回調整後的字元串的指針.
char *strchr(const char *string, int c);
查找字 串string中首次出現的位置, null結束符也包含在查找中. 傳回一個指針, 指向字元c在字元串string中首次出現的位置, 如果沒有找到, 則傳回null.
char *strrchr(const char *string, int c);
查找字元c在字元串string中最後一次出現的位置, 也就是對string進行反序搜尋, 包含null結束符.
傳回一個指針, 指向字元c在字元串string中最後一次出現的位置, 如果沒有找到, 則傳回null.
char *strstr(const char *string, const char *strsearch);
在字元串string中查找strsearch子串. 傳回子串strsearch在string中首次出現位置的指針. 沒有找到子串strsearch, 則傳回null. 如果子串strsearch為空串, 函數傳回string值.
char *strdup(const char *strsource);
函數運作中會自己調用malloc函數為複制strsource字元串配置設定存儲空間, 然後再将strsource複制到配置設定到的空間中. 注意要及時釋放這個配置設定的空間.
傳回一個指針, 指向為複制字元串配置設定的空間; 如果配置設定空間失敗, 則傳回null值.
char *strcat(char *strdestination, const char *strsource);
将源串strsource添加到目标串strdestination後面, 并在得到的新串後面加上null結束符. 源串strsource的字元會覆寫目标串strdestination後面的結束符null. 在字元串的複制或添加過程中沒有溢出檢查, 是以要保證目标串空間足夠大. 不能處理源串與目标串重疊的情況. 函數傳回strdestination值.
char *strncat(char *strdestination, const char *strsource, size_t count);
将源串strsource開始的count個字元添加到目标串strdest後. 源串strsource的字元會覆寫目标串strdestination後面的結束符null. 如果count大于源串長度, 則會用源串的長度值替換count值. 得到的新串後面會自動加上null結束符. 與strcat函數一樣, 本函數不能處理源串與目标串重疊的情況. 函數傳回strdestination值.
char *strcpy(char *strdestination, const char *strsource);
複制源串strsource到目标串strdestination所指定的位置, 包含null結束符. 不能處理源串與目标串重疊的情況.函數傳回strdestination值.
char *strncpy(char *strdestination, const char *strsource, size_t count);
将源串strsource開始的count個字元複制到目标串strdestination所指定的位置. 如果count值小于或等于strsource串的長度, 不會自動添加null結束符目标串中, 而count大于strsource串的長度時, 則将strsource用null結束符填充補齊count個字元, 複制到目标串中. 不能處理源串與目标串重疊的情況.函數傳回strdestination值.
char *strset(char *string, int c);
将string串的所有字元設定為字元c, 遇到null結束符停止. 函數傳回内容調整後的string指針.
char *strnset(char *string, int c, size_t count);
将string串開始count個字元設定為字元c, 如果count值大于string串的長度, 将用string的長度替換count值. 函數傳回内容調整後的string指針.
size_t strspn(const char *string, const char *strcharset);
查找任何一個不包含在strcharset串中的字元 (字元串結束符null除外) 在string串中首次出現的位置序号. 傳回一個整數值, 指定在string中全部由characters中的字元組成的子串的長度. 如果string以一個不包含在strcharset中的字元開頭, 函數将傳回0值.
size_t strcspn(const char *string, const char *strcharset);
查找strcharset串中任何一個字元在string串中首次出現的位置序号, 包含字元串結束符null.
傳回一個整數值, 指定在string中全部由非characters中的字元組成的子串的長度. 如果string以一個包含在strcharset中的字元開頭, 函數将傳回0值.
char *strspnp(const char *string, const char *strcharset);
查找任何一個不包含在strcharset串中的字元 (字元串結束符null除外) 在string串中首次出現的位置指針. 傳回一個指針, 指向非strcharset中的字元在string中首次出現的位置.
char *strpbrk(const char *string, const char *strcharset);
查找strcharset串中任何一個字元在string串中首次出現的位置, 不包含字元串結束符null.
傳回一個指針, 指向strcharset中任一字元在string中首次出現的位置. 如果兩個字元串參數不含相同字元, 則傳回null值.
int strcmp(const char *string1, const char *string2);
比較字元串string1和string2大小.
傳回值< 0, 表示string1小于string2;
傳回值為0, 表示string1等于string2;
傳回值> 0, 表示string1大于string2.
int stricmp(const char *string1, const char *string2);
比較字元串string1和string2大小,和strcmp不同, 比較的是它們的小寫字母版本.傳回值與strcmp相同.
int strcmpi(const char *string1, const char *string2);
等價于stricmp函數, 隻是提供一個向後相容的版本.
int strncmp(const char *string1, const char *string2, size_t count);
比較字元串string1和string2大小,隻比較前面count個字元. 比較過程中, 任何一個字元串的長度小于count, 則count将被較短的字元串的長度取代. 此時如果兩串前面的字元都相等, 則較短的串要小.
傳回值< 0, 表示string1的子串小于string2的子串;
傳回值為0, 表示string1的子串等于string2的子串;
傳回值> 0, 表示string1的子串大于string2的子串.
int strnicmp(const char *string1, const char *string2, size_t count);
比較字元串string1和string2大小,隻比較前面count個字元. 與strncmp不同的是, 比較的是它們的小寫字母版本. 傳回值與strncmp相同.
char *strtok(char *strtoken, const char *strdelimit);
在strtoken 串中查找下一個标記, strdelimit字元集則指定了在目前查找調用中可能遇到的分界符. 傳回一個指針, 指向在strtoken中找到的下一個标記. 如果找不到标記, 就傳回null值. 每次調用都會修改strtoken内容, 用null字元替換遇到的每個分界符.