函數原型
原型:strcpy(char destination[], const char source[]);#include#include int main() { char str1[10] = { "Tsinghua "}; char str2[10] = { "Computer"}; cout < return 0; } 運行結果:Comnghua 注意:字符串source中前numchars個字符將覆蓋掉字符串destination中前numchars個字符 原型:strcat(char target[], const char source[]); 功能:將字符串source接到字符串target的後面 例程: [cpp] view plaincopy #include #include int main(void) { char str1[] = { "Tsinghua "}; char str2[] = { "Computer"}; cout < return 0; } 運行結果:Tsinghua Computer 注意:在定義字符數組1的長度時應該考慮字符數組2的長度,因為連接後新字符串的長度為兩個字符串長度之和。進行字符串連接後,字符串1的結尾符將自動被去掉,在結尾串末尾保留新字符串後面一個結尾符。 原型:strncat(char target[], const char source[], int numchars); 功能:將字符串source的前numchars個字符接到字符串target的後面 例程: [cpp] view plaincopy #include #include int main() { char str1[] = { "Tsinghua "}; char str2[] = { "Computer"}; cout < return 0; } 運行結果:Tsinghua Com 原型:int strcmp(const char firststring[], const char secondstring); 功能:比較兩個字符串firststring和secondstring 例程: [cpp] view plaincopy #include #include int main() { char buf1[] = "aaa"; char buf2[] = "bbb"; char buf3[] = "ccc"; int ptr; ptr = strcmp(buf2,buf1); if(ptr > 0) cout <<"Buffer 2 is greater than buffer 1"< else cout <<"Buffer 2 is less than buffer 1"< ptr = strcmp(buf2,buf3); if(ptr > 0) cout <<"Buffer 2 is greater than buffer 3"< else cout <<"Buffer 2 is less than buffer 3"< return 0; } 運行結果是:Buffer 2 is less than buffer 1 Buffer 2 is greater than buffer 3 原型:strlen( const char string[] ); 功能:統計字符串string中字符的個數 例程: [cpp] view plaincopy #include #include int main() { char str[100]; cout <<"請輸入一個字符串:"; cin >>str; cout <<"The length of the string is :"< return 0; } 運行結果The length of the string is x (x為你輸入的字符總數字) 注意:strlen函數的功能是計算字符串的實際長度,不包括'\0'在內。另外,strlen函數也可以直接測試字符串常量的長度,如:strlen("Welcome")。 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的值. void *memchr(const 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字符替換遇到的每個分界符. C++概念字符串操作 一、char_traits 字符特征類 1)意義:包裝特定串元素的通用行為界面,以便容器實現時依據特征信息而執行特定行為 2)定義了通用類型名 [cpp] view plaincopy typedef _Elem char_type; typedef int int_type; typedef streampos pos_type; typedef streamoff off_type; typedef mbstate_t state_type; 其中 int_type 表示字符元素轉換到特定編碼時的整型表示,pos_type, off_type 分別作為字符串索引和字符串元素偏移的類型,類似容器迭中的指針,迭代類型和指針,迭代器的偏移類型。最後的 state_type 用於存儲流狀態,如出錯,格式控制等等。 3)定義了字符 / 字符串操作的包裝界面,以便通用算法的調用 assign(a, b) 定義將 b 字符賦值給 a 字符的過程,實現 a.operator = 的行為 eq(a, b) 定義 a 字符和 b 字符的相等關系,實現 a.operator == 的行為 lt(a, b) 定義 a 小於 b 的關系,實現 a.operator < 的行為 compare(a_ptr, b_ptr, cnt) 定義兩組字符串的比較,返回 int 類型,實現類似 memcmp 的行為 length(ptr) 定義取字符串長度,實現類似 strlen 的行為 copy(a_ptr, b_ptr, cnt) 定義兩組字符串的復制,實現類似 memcpy 的行為 move(a_ptr, b_ptr, cnt) 定義兩組字符串的不重疊復制,實現類似 memmove 的行為 assign(ptr, cnt, ch) 定義了填充字符串的過程,實現類似 memset 的行為 to_int_type(ch) 定義了 char_type 到 int_type 整型的轉換過程 to_char_type(n) 定義了 int_type 到 char_type 字符型的轉換過程 eq_int_type(a, b) 定義兩個和當前 char_type 類型對應的 int_type 的相等關系 eof() 定義字符串結尾符,使用整型表示 not_eof(n) 定義非字符串結尾符,若輸入結尾符,則返回 1,其他輸入返回原值,即總是不返回 eof() 4)int_type 類型應是當前字符類型的整型編碼 二、std::string 並不是序列容器,沒有 front() 和 back() 界面用於取出前端和尾端的元素,使用 std::string::operator [] 並傳遞 streampos 類型取得特定元素,如 std::string::size() - 1 作為索引取得最後一個字符 三、basic_string 支持的初始化 1)默認初始化 2)分配器 3)復制構造 4)局部復制 [_Roff, _Roff + _Count) 5)局部復制 + 分配器 6)C 字符串 [_Ptr, ) 7)C 字符串 + _Count [_Ptr, _Ptr + _Count) 8)C 字符串 + 分配器 9)C 字符串 + _Count + 分配器 [_Ptr, _Ptr + _Count) 10)_Count * _Ch 11)_Count * _Ch + 分配器 12)迭代器 [_ItF, _ItL) 13)迭代器 + 分配器 字符到串不能初始化,但支持 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)compare(s2) 其他同類型字符串 2)compare(p) C 風格字符串 3)compare(off, cnt, s2) [off, off + cnt) 同 s2 執行比較 4)compare(off, cnt, s2, off2, cnt2) [off, off + cnt) 同 s2 [off2, cnt2) 執行比較 5)compare(off, cnt, p) [off, off + cnt) 同 [p ,) 執行比較 6)compare(off, cnt, p, cnt2) [off, off + cnt) 同 [p, p + cnt2) 執行比較 返回 -1, 0, 1 作為小於、等於和大於的比較結果。
六、附加數據
1)使用 operator += 接受其他字符串,C 風格字符串和字符 2)使用 push_back() 在尾部附加字符,並使得通過字符串構造的 back_iterator 可以訪問 3)append() 附加 1、append(s) 追加字符串 2、append(s, off, cnt) 追加字符串 s [off, off + cnt) 3、append(p) 追加字符串 [p,) 4、append(p, cnt) 追加字符串 [p, p + cnt) 5、append(n, c) 填充 n * c 6、append(InF, InL) 追加輸入流 [InF, InL) 4)insert() 插入 1、insert(off, s2) 插入字符串 2、insert(off, s2, off2, cnt2) 插入字符串 s [off2, off2 + cnt2) 3、insert(off, p) 插入字符串 [p, ) 4、insert(off, p, cnt) 插入字符串 [p, p + cnt) 5、insert(off, n, c) 插入 n * c 6、insert(iter) 元素默認值填充 7、insert(iter, c) 插入特定元素 8、insert(iter, n, c) 插入 n*c 9、insert(iter, InF, InL) 插入 [InF, InL) 5)operator +(a, b) 字符串關聯運算符重載中支持 operator + 的形式 1、s + s 2、s + p 3、s + c 4、p + s 5、c + s
七、查找、替換和清除
1)find() 查找 1、find(c, off) 在 s [off, npos) 中查找 c 2、find(p, off, n) 在 s [off, npos) 中查找 [p, p + n) 3、find(p, off) 在 s [off, npos) 中查找 [p,) 4、find(s2, off) 在 s [off, npos) 中查找 s2 2)find() 的變種 1、rfind() 具有 find() 的輸入形式,反序查找 2、find_first_of() 具有 find() 的輸入形式,返回第一個匹配的索引 3、find_last_of() 具有 find() 的輸入形式,返回倒數第一個匹配的索引 4、find_first_not_of() 具有 find() 的輸入形式,返回第一個不匹配的索引 5、find_last_not_of() 具有 find() 的輸入形式,返回倒數第一個不匹配的索引 3)replace() 替換 1、replace(off, cnt, s2) 將 s [off, off + cnt) 替換成 s2 2、replace(off, cnt, s2, off2, cnt2) 將 s [off, off + cnt) 替換成 s2 [off2, off2 + cnt2) 3、replace(off, cnt, p) 將 s [off, off + cnt) 替換成 [p, ) 4、replace(off, cnt, p, cnt2) 將 s [off, off + cnt) 替換成 [p, p + cnt2) 5、replace(off, cnt, n, c) 將 s [off, off + cnt) 替換成 c * n 使用迭代器的情況: 6、replace(InF, InL, s2) 將 [InF, InL) 替換成 s2 7、replace(InF, InL, p) 將 [InF, InL) 替換成 [p, ) 8、replace(InF, InL, p, cnt) 將 [InF, InL) 替換成 [p, p + cnt) 9、replace(InF, InL, n, c) 將 [InF, InL) 替換成 n * c 10、replace(InF, InL, InF2, InL2) 將 [InF, InL) 替換成 [InF2, InL2) 4)erase() 刪除 1、erase(off, cnt) 從字符串 s 中刪除 s [off, off + cnt) 2、erase(iter) 從字符串 s 中刪除 *iter 3、erase(ItF, ItL) 從字符串 s 中刪除 [ItF, ItL)
八、取出字符串
1)取得 C 風格字符串 c_str() 返回常量類型的 C 風格字符串指針,copy(ptr, cnt, off = 0) 則將指定大小的字符串復制到特定指針。data() 在 Visual C++ 7.1 中僅僅調用了 c_str() 實現。 2)取得子字符串 substr(off, cnt) 取得 s [off, off + cnt) 的副本。 3)復制子字符串 copy(p, off, cnt) 將 s [off, off + cnt) 復制到 p。 九、字符串的緩沖區管理 字符串具有類似 std::vector 的緩沖區管理界面。 size() 取得有效元素長度 max_size() 取得當前內存分配器能分配的有效空間 reserve() 為緩沖區預留空間 capacity() 取得緩沖區的容量 resize() 重設串的長度,可以為其指定初始化值 十、定義輸入迭代器的尾端 向 istream_iterator 傳遞輸入流對象以創建輸入迭代器,輸入迭代器持有輸入流對象的指針,默認創建和讀取流失敗的情況下該指針被設置為 0。並且在實現輸入迭代器間的 operator == 相等運算時,進行持有的流對象指針的相等比較,這樣,默認創建的輸入迭代器將被用於匹配輸入流的結束。 * 當輸入流讀取失敗,用戶執行 if, while 條件判斷時,實際上先將判斷值轉換成 void* 類型,或者根據 operator ! 運算符的返回結果,對輸入流重載 operator void* 和 operator ! 運算符,可以定義輸入流在布爾表達式中的行為,使得當流讀取失敗的情況下,輸入迭代器可以通過布爾表達式來確認,而不是顯式訪問 fail() 成員函數.