string 類(lèi)提供的各種操作函數(shù)大致分為八類(lèi):構(gòu)造器和析構(gòu)器、大小和容量强胰、元素存取舱沧、字 符串比較、字符串修改偶洋、字符串接合熟吏、I/O 操作以及搜索和查找。
構(gòu)造函數(shù)有四個(gè)參數(shù)玄窝,其中三個(gè)具有默認(rèn)值牵寺。要初始化一個(gè) string 類(lèi),可以使用 C 風(fēng)格字符串或 string 類(lèi)型對(duì)象恩脂,也可以使用 C 風(fēng)格字符串的部分或 string 類(lèi)型對(duì)象的部分或序列缸剪。
注意,不能使用字符或者整數(shù)去初始化字符串东亦。
常見(jiàn)的 string 類(lèi)構(gòu)造函數(shù)有以下幾種形式:
string strs //生成空字符串
string s(str) //生成字符串str的復(fù)制品
string s(str, stridx) //將字符串str中始于stridx的部分作為構(gòu)造函數(shù)的初值
string s(str, strbegin, strlen) //將字符串str中始于strbegin杏节、長(zhǎng)度為strlen的部分作為字符串初值
string s(cstr) //以C_string類(lèi)型cstr作為字符串s的初值
string s(cstr,char_len) //以C_string類(lèi)型cstr的前char_len個(gè)字符串作為字符串s的初值
strings(num, c) //生成一個(gè)字符串唬渗,包含num個(gè)c字符
strings(strs, beg, end) //以區(qū)間[beg, end]內(nèi)的字符作為字符串s的初值
析構(gòu)函數(shù)的形式如下:
~string() //銷(xiāo)毀所有內(nèi)存,釋放內(nèi)存
如果字符串只包含一個(gè)字符奋渔,使用構(gòu)造函數(shù)對(duì)其初始化時(shí)镊逝,使用以下兩種形式比較合理:
std::string s('x'); //錯(cuò)誤
std::string s(1, 'x'); //正確
std::string s("x"); //正確
C_string 一般被認(rèn)為是常規(guī)的 C++ 字符串。目前嫉鲸,在 C++ 中確實(shí)存在一個(gè)從 const char * 到 string 的隱式型別轉(zhuǎn)換撑蒜,卻不存在從 string 對(duì)象到 C_string 的自動(dòng)型別轉(zhuǎn)換。對(duì)于 string 類(lèi)型的字符串玄渗,可以通過(guò) c_str() 函數(shù)返回該 string 類(lèi)對(duì)象對(duì)應(yīng)的 C_string座菠。
通常,程序員在整個(gè)程序中應(yīng)堅(jiān)持使用 string 類(lèi)對(duì)象藤树,直到必須將內(nèi)容轉(zhuǎn)化為 char* 時(shí)才將其轉(zhuǎn)換為 C_string浴滴。
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str ("12345678");
char ch[ ] = "abcdefgh";
string a; //定義一個(gè)空字符串
string str_1 (str); //構(gòu)造函數(shù),全部復(fù)制
string str_2 (str, 2, 5); //構(gòu)造函數(shù)岁钓,從字符串str的第2個(gè)元素開(kāi)始升略,復(fù)制5個(gè)元素,賦值給str_2
string str_3 (ch, 5); //將字符串ch的前5個(gè)元素賦值給str_3
string str_4 (5,'X'); //將 5 個(gè) 'X' 組成的字符串 "XXXXX" 賦值給 str_4
string str_5 (str.begin(), str.end()); //復(fù)制字符串 str 的所有元素屡限,并賦值給 str_5
cout << str << endl;
cout << a << endl ;
cout << str_1 << endl;
cout << str_2 << endl;
cout << str_3 << endl;
cout << str_4 << endl;
cout << str_5 << endl;
return 0;
}
1.賦值
=
,assign()
string a;
a.assign("bbb");
string a="bbb";
從鍵盤(pán)賦值:
cin>>a;
以空格作為結(jié)束
getline(cin,a);
以回車(chē)作為結(jié)束
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1 ("123456");
string str;
str.assign (str1); //直接賦值
cout << str << endl;
str.assign (str1, 3, 3); //賦值給子串
cout << str << endl;
str.assign (str1,2,str1.npos);//賦值給從位置 2 至末尾的子串
cout << str << endl;
str.assign (5,'X'); //重復(fù) 5 個(gè)'X'字符
cout << str << endl;
string::iterator itB;
string::iterator itE;
itB = str1.begin ();
itE = str1.end();
str.assign (itB, (--itE)); //從第 1 個(gè)至倒數(shù)第 2 個(gè)元素品嚣,賦值給字符串 str
cout << str << endl;
return 0;
}
2.交換兩個(gè)字符串的內(nèi)容
swap(string a,string b);
3.添加字符
a+=b
、a.append(string b);
4.插入字符
a.insert(位置下標(biāo)钧大,要插入的字符串);
5.刪除字符
a.erase(要?jiǎng)h除的字符的位置下標(biāo))翰撑;
a.erase(要?jiǎng)h除子串的起始位置下標(biāo), 子串的長(zhǎng)度);
6.移除全部字符
賦空串a=""
、a.clear()
//后者在VC6下不可以使用
7.改變字符串?dāng)?shù)量
resize()
調(diào)整容器中有效數(shù)據(jù)區(qū)域的尺寸,如果尺寸變小,原來(lái)數(shù)據(jù)多余的截掉;如果尺寸變大,不夠的數(shù)據(jù)用該函數(shù)的第二個(gè)參數(shù)填充碍遍,因此會(huì)影響size()。
string a="jessy"; a.resize(10,'b');
8.替換字符串
a.replace(起始位置咆爽,長(zhǎng)度巩踏,新的字符串)
9.串聯(lián)字符串
+
10.比較字符串內(nèi)容
==
!=
<
<=
>
>=
compare()
a.compare(b)
如果在使用 compare() 函數(shù)時(shí),參數(shù)中出現(xiàn)了位置和大小靠闭,比較時(shí)只能用指定的子串帐我。例如:
s.compare {pos,n, s2);
若參與比較的兩個(gè)串值相同,則函數(shù)返回 0愧膀;若字符串 S 按字典順序要先于 S2拦键,則返回負(fù)值;反之檩淋,則返回正值
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string A ("aBcdef");
string B ("AbcdEf");
string C ("123456");
string D ("123dfg");
//下面是各種比較方法
int m=A.compare (B); //完整的A和B的比較
int n=A.compare(1,5,B,4,2); //"Bcdef"和"AbcdEf"比較
int p=A.compare(1,5,B,4,2); //"Bcdef"和"Ef"比較
int q=C.compare(0,3,D,0,3); //"123"和"123"比較
cout << "m = " << m << ", n = " << n <<", p = " << p << ", q = " << q << endl;
cin.get();
return 0;
}
11.返回字符數(shù)量
a.size()
a.length()
12.返回字符的最大可能個(gè)數(shù)
a.max_size();
13.判斷字符串是否為空
a.empty();
14.返回重新分配之前的字符容量
a.capacity()
15.保留內(nèi)存以存儲(chǔ)一定量的字符
a.reserve(大小)
并沒(méi)有實(shí)際分配內(nèi)存芬为,影響capacity()
16.將內(nèi)容復(fù)制為一個(gè)C-string
a.copy(p,n,size_type_Off=0);
從string對(duì)象中至多復(fù)制n個(gè)字符到字符指針p指向的空間中萄金。默認(rèn)從首字符開(kāi)始。copy不會(huì)申請(qǐng)分配空間媚朦,所以用戶(hù)要確保p指向的空間足夠保存n個(gè)字符氧敢。
17.將內(nèi)容以 C - string 形式返回
c_str();
返回一個(gè)指向某字符串的指針。
#include<iostream>
#include<string>
using namespace std;
int main()
{
const char* b;
string a="haha";
b=a.c_str();
cout<<b<<endl;//輸出:haha
a="pupu";
cout<<b<<endl;//輸出:pupu
return 0;
}
18.將內(nèi)容以字符數(shù)組形式返回
data()
與c_str()類(lèi)似询张,但是返回的數(shù)組不以空字符終止孙乖。
#include<iostream>
#include<string>
using namespace std;
int main()
{
const char* b;
string a="haha";
b=a.data();
cout<<b[3];
return 0;
}
19.返回子字符串
a.substr(start,end);
20.搜尋某子字符串或字符
string str1,str2;
char c;
//從str1中查找str2,返回str2中首個(gè)字符在str1中的地址
str1.find(str2);
str1.find(str2,5);
//在str1中查找字符c并返回第一個(gè)查找到的地址
str1.find(c);
//在str1中的第2個(gè)字符開(kāi)始查找str2的前兩個(gè)字符份氧,并返回str2的首字符在str1中的位置
str1.find(str2,2,2);
rfind()
函數(shù)的原型和find()函數(shù)的原型類(lèi)似唯袄,參數(shù)情況也類(lèi)似。只不過(guò) rfind() 函數(shù)適用于實(shí)現(xiàn)逆向查找
find_first_of()
函數(shù)可實(shí)現(xiàn)在源串中搜索某字符串的功能蜗帜,該函數(shù)的返回值是被搜索字符串的第 1 個(gè)字符第 1 次出現(xiàn)的下標(biāo)(位置)恋拷。若查找失敗,則返回 npos钮糖。
find_last_of()
函數(shù)同樣可實(shí)現(xiàn)在源串中搜索某字符串的功能梅掠。與 find_first_of() 函數(shù)所不同的是,該函數(shù)的返回值是被搜索字符串的最后 1 個(gè)字符的下標(biāo)(位置)店归。若查找失敗阎抒,則返回 npos。
find_first_not_of()
函數(shù)可實(shí)現(xiàn)在源字符串中搜索與指定字符(串)不相等的第 1 個(gè)字符
find_last_not_of()
函數(shù)可實(shí)現(xiàn)在源字符串中搜索與指定字符(串)不相等的最后 1 個(gè)字符消痛。