一究恤、字符串操作
- strcpy(p, p1) 復制字符串
- strncpy(p, p1, n) 復制指定長度字符串
- strcat(p, p1) 附加字符串
- strncat(p, p1, n) 附加指定長度字符串
- strlen(p) 取字符串長度
- strcmp(p, p1) 比較字符串
- strcasecmp忽略大小寫比較字符串
- strncmp(p, p1, n) 比較指定長度字符串
- strchr(p, c) 在字符串中查找指定字符
- strrchr(p, c) 在字符串中反向查找
- strstr(p, p1) 查找字符串
- strpbrk(p, p1) 以目標字符串的所有字符作為集合咬腕,在當前字符串查找該集合的任一元素
- strspn(p, p1) 以目標字符串的所有字符作為集合,在當前字符串查找不屬于該集合的任一元素的偏移
- strcspn(p, p1) 以目標字符串的所有字符作為集合遏插,在當前字符串查找屬于該集合的任一元素的偏移
具有指定長度的字符串處理函數(shù)在已處理的字符串之后填補零結尾符
二邻寿、字符串到數(shù)值類型的轉換
- strtod(p, ppend) 從字符串 p 中轉換 double 類型數(shù)值,并將后續(xù)的字符串指針存儲到 ppend 指向的 char* 類型存儲慨代。
- strtol(p, ppend, base) 從字符串 p 中轉換 long 類型整型數(shù)值更哄,base 顯式設置轉換的整型進制芋齿,設置為 0 以根據(jù)特定格式判斷所用進制腥寇,0x, 0X 前綴以解釋為十六進制格式整型,0 前綴以解釋為八進制格式整型
- atoi(p) 字符串轉換到 int 整型
- atof(p) 字符串轉換到 double 符點數(shù)
- atol(p) 字符串轉換到 long 整型
三觅捆、字符檢查
- isalpha() 檢查是否為字母字符
- isupper() 檢查是否為大寫字母字符
- islower() 檢查是否為小寫字母字符
- isdigit() 檢查是否為數(shù)字
- isxdigit() 檢查是否為十六進制數(shù)字表示的有效字符
- isspace() 檢查是否為空格類型字符
- iscntrl() 檢查是否為控制字符
- ispunct() 檢查是否為標點符號
- isalnum() 檢查是否為字母和數(shù)字
- isprint() 檢查是否是可打印字符
- isgraph() 檢查是否是圖形字符赦役,等效于 isalnum() | ispunct()
四、函數(shù)原型
-
原型:strcpy(char destination[], const char source[]);
功能:將字符串source拷貝到字符串destination中
例程:#include <iostream.h> #include <string.h> void main(void) { char str1[10] = { "TsinghuaOK"}; char str2[10] = { "Computer"}; cout <<strcpy(str1,str2)<<endl; }
運行結果是:Computer
第二個字符串將覆蓋掉第一個字符串的所有內容栅炒!
注意:在定義數(shù)組時扩劝,字符數(shù)組1的字符串長度必須大于或等于字符串2的字符串長度。不能用賦值語句將一個字符串常量或字符數(shù)組直接賦給一個字符數(shù)組职辅。所有字符串處理函數(shù)都包含在頭文件string.h中棒呛。
- strncpy(char destination[], const char source[], int numchars);
原型:strncpy(char destination[], const char source[], int numchars);
功能:將字符串source中前numchars個字符拷貝到字符串destination中
例程:
#include <iostream.h>
#include <string.h>
void main(void)
{
char str1[10] = { "Tsinghua "};
char str2[10] = { "Computer"};
cout <<strncpy(str1,str2,3)<<endl;
}
運行結果:Comnghua
注意:字符串source中前numchars個字符將覆蓋掉字符串destination中前numchars個字符!
- 原型:strcat(char target[], const char source[]);
功能:將字符串source接到字符串target的后面
例程:
include <iostream.h>
include <string.h>
void main(void)
{
char str1[] = { "Tsinghua "};
char str2[] = { "Computer"};
cout <<strcpy(str1,str2)<<endl;
}
運行結果:Tsinghua Computer
注意:在定義字符數(shù)組1的長度時應該考慮字符數(shù)組2的長度域携,因為連接后新字符串的長度為兩個字符串長度之和簇秒。進行字符串連接后,字符串1的結尾符將自動被去掉秀鞭,在結尾串末尾保留新字符串后面一個結尾符趋观。
- 原型:strncat(char target[], const char source[], int numchars);
功能:將字符串source的前numchars個字符接到字符串target的后面
例程:
include <iostream.h>
include <string.h>
void main(void)
{
char str1[] = { "Tsinghua "};
char str2[] = { "Computer"};
cout <<strncat(str1,str2,3)<<endl;
}
運行結果:Tsinghua Com
原型:int strcmp(const char firststring[], const char secondstring);
功能:比較兩個字符串firststring和secondstring
例程:
include <iostream.h>
include <string.h>
void main(void)
{
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"<<endl;
else
cout <<"Buffer 2 is less than buffer 1"<<endl;
ptr = strcmp(buf2,buf3);
if(ptr > 0)
cout <<"Buffer 2 is greater than buffer 3"<<endl;
else
cout <<"Buffer 2 is less than buffer 3"<<endl;
}
運行結果是:Buffer 2 is less than buffer 1
Buffer 2 is greater than buffer 3
原型:strlen( const char string[] );
功能:統(tǒng)計字符串string中字符的個數(shù)
例程:
include <iostream.h>
include <string.h>
void main(void)
{
char str[100];
cout <<"請輸入一個字符串:";
cin >>str;
cout <<"The length of the string is :"<<strlen(str)<<"個"<<endl;
}
運行結果The length of the string is x (x為你輸入的字符總數(shù)字)
注意:strlen函數(shù)的功能是計算字符串的實際長度,不包括'\0'在內锋边。另外皱坛,strlen函數(shù)也可以直接測試字符串常量的長度,如: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字節(jié)的字符到dest. 如果src和dest出現(xiàn)重疊, 函數(shù)會自動處理. 返回dest的值.
void *memcpy(void *dest, const void *src, size_t count);
從src復制count字節(jié)的字符到dest. 與memmove功能一樣, 只是不能處理src和dest出現(xiàn)重疊. 返回dest的值.
void *memchr(const void *buf, int c, size_t count);
在buf前面count字節(jié)中查找首次出現(xiàn)字符c的位置. 找到了字符c或者已經(jīng)搜尋了count個字節(jié), 查找即停止. 操作成功則返回buf中首次出現(xiàn)c的位置指針, 否則返回NULL.
void *_memccpy(void *dest, const void *src, int c, size_t count);
從src復制0個或多個字節(jié)的字符到dest. 當字符c被復制或者count個字符被復制時, 復制停止.
如果字符c被復制, 函數(shù)返回這個字符后面緊挨一個字符位置的指針. 否則返回NULL.
int memcmp(const void *buf1, const void *buf2, size_t count);
比較buf1和buf2前面count個字節(jié)大小.
返回值< 0, 表示buf1小于buf2;
返回值為0, 表示buf1等于buf2;
返回值> 0, 表示buf1大于buf2.
int memicmp(const void *buf1, const void *buf2, size_t count);
比較buf1和buf2前面count個字節(jié). 與memcmp不同的是, 它不區(qū)分大小寫.
返回值同上.
char *strrev(char *string);
將字符串string中的字符順序顛倒過來. NULL結束符位置不變. 返回調整后的字符串的指針.
char *_strupr(char *string);
將string中所有小寫字母替換成相應的大寫字母, 其它字符保持不變. 返回調整后的字符串的指針.
char *_strlwr(char *string);
將string中所有大寫字母替換成相應的小寫字母, 其它字符保持不變. 返回調整后的字符串的指針.
char *strchr(const char *string, int c);
查找字 串string中首次出現(xiàn)的位置, NULL結束符也包含在查找中. 返回一個指針, 指向字符c在字符串string中首次出現(xiàn)的位置, 如果沒有找到, 則返回NULL.
char *strrchr(const char *string, int c);
查找字符c在字符串string中最后一次出現(xiàn)的位置, 也就是對string進行反序搜索, 包含NULL結束符.
返回一個指針, 指向字符c在字符串string中最后一次出現(xiàn)的位置, 如果沒有找到, 則返回NULL.
char *strstr(const char *string, const char *strSearch);
在字符串string中查找strSearch子串. 返回子串strSearch在string中首次出現(xiàn)位置的指針. 如果沒有找到子串strSearch, 則返回NULL. 如果子串strSearch為空串, 函數(shù)返回string值.
char *strdup(const char *strSource);
函數(shù)運行中會自己調用malloc函數(shù)為復制strSource字符串分配存儲空間, 然后再將strSource復制到分配到的空間中. 注意要及時釋放這個分配的空間.
返回一個指針, 指向為復制字符串分配的空間; 如果分配空間失敗, 則返回NULL值.
char *strcat(char *strDestination, const char *strSource);
將源串strSource添加到目標串strDestination后面, 并在得到的新串后面加上NULL結束符. 源串strSource的字符會覆蓋目標串strDestination后面的結束符NULL. 在字符串的復制或添加過程中沒有溢出檢查, 所以要保證目標串空間足夠大. 不能處理源串與目標串重疊的情況. 函數(shù)返回strDestination值.
char *strncat(char *strDestination, const char *strSource, size_t count);
將源串strSource開始的count個字符添加到目標串strDest后. 源串strSource的字符會覆蓋目標串strDestination后面的結束符NULL. 如果count大于源串長度, 則會用源串的長度值替換count值. 得到的新串后面會自動加上NULL結束符. 與strcat函數(shù)一樣, 本函數(shù)不能處理源串與目標串重疊的情況. 函數(shù)返回strDestination值.
char *strcpy(char *strDestination, const char *strSource);
復制源串strSource到目標串strDestination所指定的位置, 包含NULL結束符. 不能處理源串與目標串重疊的情況.函數(shù)返回strDestination值.
char *strncpy(char *strDestination, const char *strSource, size_t count);
將源串strSource開始的count個字符復制到目標串strDestination所指定的位置. 如果count值小于或等于strSource串的長度, 不會自動添加NULL結束符目標串中, 而count大于strSource串的長度時, 則將strSource用NULL結束符填充補齊count個字符, 復制到目標串中. 不能處理源串與目標串重疊的情況.函數(shù)返回strDestination值.
char *strset(char *string, int c);
將string串的所有字符設置為字符c, 遇到NULL結束符停止. 函數(shù)返回內容調整后的string指針.
char *strnset(char *string, int c, size_t count);
將string串開始count個字符設置為字符c, 如果count值大于string串的長度, 將用string的長度替換count值. 函數(shù)返回內容調整后的string指針.
size_t strspn(const char *string, const char *strCharSet);
查找任何一個不包含在strCharSet串中的字符 (字符串結束符NULL除外) 在string串中首次出現(xiàn)的位置序號. 返回一個整數(shù)值, 指定在string中全部由characters中的字符組成的子串的長度. 如果string以一個不包含在strCharSet中的字符開頭, 函數(shù)將返回0值.
size_t strcspn(const char *string, const char *strCharSet);
查找strCharSet串中任何一個字符在string串中首次出現(xiàn)的位置序號, 包含字符串結束符NULL.
返回一個整數(shù)值, 指定在string中全部由非characters中的字符組成的子串的長度. 如果string以一個包含在strCharSet中的字符開頭, 函數(shù)將返回0值.
char *strspnp(const char *string, const char *strCharSet);
查找任何一個不包含在strCharSet串中的字符 (字符串結束符NULL除外) 在string串中首次出現(xiàn)的位置指針. 返回一個指針, 指向非strCharSet中的字符在string中首次出現(xiàn)的位置.
char *strpbrk(const char *string, const char *strCharSet);
查找strCharSet串中任何一個字符在string串中首次出現(xiàn)的位置, 不包含字符串結束符NULL.
返回一個指針, 指向strCharSet中任一字符在string中首次出現(xiàn)的位置. 如果兩個字符串參數(shù)不含相同字符, 則返回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函數(shù), 只是提供一個向后兼容的版本.
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)意義:包裝特定串元素的通用行為界面,以便容器實現(xiàn)時依據(jù)特征信息而執(zhí)行特定行為
2)定義了通用類型名
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 用于存儲流狀態(tài),如出錯串塑,格式控制等等沼琉。
3)定義了字符 / 字符串操作的包裝界面,以便通用算法的調用
assign(a, b) 定義將 b 字符賦值給 a 字符的過程拟赊,實現(xiàn) a.operator = 的行為
eq(a, b) 定義 a 字符和 b 字符的相等關系刺桃,實現(xiàn) a.operator == 的行為
lt(a, b) 定義 a 小于 b 的關系粹淋,實現(xiàn) a.operator < 的行為
compare(a_ptr, b_ptr, cnt) 定義兩組字符串的比較吸祟,返回 int 類型瑟慈,實現(xiàn)類似 memcmp 的行為
length(ptr) 定義取字符串長度,實現(xiàn)類似 strlen 的行為
copy(a_ptr, b_ptr, cnt) 定義兩組字符串的復制屋匕,實現(xiàn)類似 memcpy 的行為
move(a_ptr, b_ptr, cnt) 定義兩組字符串的不重疊復制葛碧,實現(xiàn)類似 memmove 的行為
assign(ptr, cnt, ch) 定義了填充字符串的過程,實現(xiàn)類似 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, <null>)
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 += 累加賦值運算。
四贺嫂、字符串的區(qū)間有效性
對串的索引訪問在超過字符串的有效區(qū)間時滓鸠,因為串的在實現(xiàn)上對內置的字符緩沖區(qū)執(zhí)行下標訪問,所以不會導致異常第喳,但是將得到不可預知的結果糜俗,通常是不可用的。
將其他字符串作為右值輸入時曲饱,對該串取出計數(shù)大于串大小時按串大小計算吩跋。
std::basic_string::size_type 的實際類型為 size_t,在 Visual C++ 7.1 中實現(xiàn)為 unsigned渔工,std::basic_string::npos 被靜態(tài)設定為
(basic_string<_Elem, _Traits, _Alloc>::size_type)(-1);
在查找子字符串等操作時锌钮,函數(shù)返回 npos 的值表示非法索引。
五引矩、比較字符串
允許的比較對象
1)compare(s2) 其他同類型字符串
2)compare(p) C 風格字符串
3)compare(off, cnt, s2) [off, off + cnt) 同 s2 執(zhí)行比較
4)compare(off, cnt, s2, off2, cnt2) [off, off + cnt) 同 s2 [off2, cnt2) 執(zhí)行比較
5)compare(off, cnt, p) [off, off + cnt) 同 [p , <null>) 執(zhí)行比較
6)compare(off, cnt, p, cnt2) [off, off + cnt) 同 [p, p + cnt2) 執(zhí)行比較
返回 -1, 0, 1 作為小于梁丘、等于和大于的比較結果。
六旺韭、附加數(shù)據(jù)
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, <null>)
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, <null>)
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)
字符串關聯(lián)運算符重載中支持 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, <null>)
4髓窜、find(s2, off) 在 s [off, npos) 中查找 s2
2)find() 的變種
1扇苞、rfind() 具有 find() 的輸入形式,反序查找
2寄纵、find_first_of() 具有 find() 的輸入形式鳖敷,返回第一個匹配的索引
3、find_last_of() 具有 find() 的輸入形式程拭,返回倒數(shù)第一個匹配的索引
4定踱、find_first_not_of() 具有 find() 的輸入形式,返回第一個不匹配的索引
5恃鞋、find_last_not_of() 具有 find() 的輸入形式崖媚,返回倒數(shù)第一個不匹配的索引
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, <null>)
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, <null>)
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() 實現(xiàn)粤剧。
2)取得子字符串
substr(off, cnt) 取得 s [off, off + cnt) 的副本歇竟。
3)復制子字符串
copy(p, off, cnt) 將 s [off, off + cnt) 復制到 p。
九抵恋、字符串的緩沖區(qū)管理
字符串具有類似 std::vector 的緩沖區(qū)管理界面焕议。
size() 取得有效元素長度
max_size() 取得當前內存分配器能分配的有效空間
reserve() 為緩沖區(qū)預留空間
capacity() 取得緩沖區(qū)的容量
resize() 重設串的長度,可以為其指定初始化值
十弧关、定義輸入迭代器的尾端
向 istream_iterator 傳遞輸入流對象以創(chuàng)建輸入迭代器盅安,輸入迭代器持有輸入流對象的指針,默認創(chuàng)建和讀取流失敗的情況下該指針被設置為 0世囊。并且在實現(xiàn)輸入迭代器間的 operator == 相等運算時别瞭,進行持有的流對象指針的相等比較,這樣株憾,默認創(chuàng)建的輸入迭代器將被用于匹配輸入流的結束蝙寨。
- 當輸入流讀取失敗,用戶執(zhí)行 if, while 條件判斷時嗤瞎,實際上先將判斷值轉換成 void* 類型墙歪,或者根據(jù) operator ! 運算符的返回結果,對輸入流重載 operator void* 和 operator ! 運算符贝奇,可以定義輸入流在布爾表達式中的行為虹菲,使得當流讀取失敗的情況下,輸入迭代器可以通過布爾表達式來確認掉瞳,而不是顯式訪問 fail() 成員函數(shù).