string 类提供的各种操作函数大致分为八类:构造器和析构器、大小和容量、元素存取、字 符串比较、字符串修改、字符串接合、I/O 操作以及搜索和查找。
构造函数有四个参数,其中三个具有默认值。要初始化一个 string 类,可以使用 C 风格字符串或 string 类型对象,也可以使用 C 风格字符串的部分或 string 类型对象的部分或序列。
注意,不能使用字符或者整数去初始化字符串。
常见的 string 类构造函数有以下几种形式:
string strs //生成空字符串
string s(str) //生成字符串str的复制品
string s(str, stridx) //将字符串str中始于stridx的部分作为构造函数的初值
string s(str, strbegin, strlen) //将字符串str中始于strbegin、长度为strlen的部分作为字符串初值
string s(cstr) //以C_string类型cstr作为字符串s的初值
string s(cstr,char_len) //以C_string类型cstr的前char_len个字符串作为字符串s的初值
strings(num, c) //生成一个字符串,包含num个c字符
strings(strs, beg, end) //以区间[beg, end]内的字符作为字符串s的初值
析构函数的形式如下:
~string() //销毁所有内存,释放内存
如果字符串只包含一个字符,使用构造函数对其初始化时,使用以下两种形式比较合理:
std::string s('x'); //错误
std::string s(1, 'x'); //正确
std::string s("x"); //正确
C_string 一般被认为是常规的 C++ 字符串。目前,在 C++ 中确实存在一个从 const char * 到 string 的隐式型别转换,却不存在从 string 对象到 C_string 的自动型别转换。对于 string 类型的字符串,可以通过 c_str() 函数返回该 string 类对象对应的 C_string。
通常,程序员在整个程序中应坚持使用 string 类对象,直到必须将内容转化为 char* 时才将其转换为 C_string。
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str ("12345678");
char ch[ ] = "abcdefgh";
string a; //定义一个空字符串
string str_1 (str); //构造函数,全部复制
string str_2 (str, 2, 5); //构造函数,从字符串str的第2个元素开始,复制5个元素,赋值给str_2
string str_3 (ch, 5); //将字符串ch的前5个元素赋值给str_3
string str_4 (5,'X'); //将 5 个 'X' 组成的字符串 "XXXXX" 赋值给 str_4
string str_5 (str.begin(), str.end()); //复制字符串 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";
从键盘赋值:
cin>>a;
以空格作为结束
getline(cin,a);
以回车作为结束
#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'); //重复 5 个'X'字符
cout << str << endl;
string::iterator itB;
string::iterator itE;
itB = str1.begin ();
itE = str1.end();
str.assign (itB, (--itE)); //从第 1 个至倒数第 2 个元素,赋值给字符串 str
cout << str << endl;
return 0;
}
2.交换两个字符串的内容
swap(string a,string b);
3.添加字符
a+=b
、a.append(string b);
4.插入字符
a.insert(位置下标,要插入的字符串);
5.删除字符
a.erase(要删除的字符的位置下标);
a.erase(要删除子串的起始位置下标, 子串的长度);
6.移除全部字符
赋空串a=""
、a.clear()
//后者在VC6下不可以使用
7.改变字符串数量
resize()
调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉;如果尺寸变大,不够的数据用该函数的第二个参数填充,因此会影响size()。
string a="jessy"; a.resize(10,'b');
8.替换字符串
a.replace(起始位置,长度,新的字符串)
9.串联字符串
+
10.比较字符串内容
==
!=
<
<=
>
>=
compare()
a.compare(b)
如果在使用 compare() 函数时,参数中出现了位置和大小,比较时只能用指定的子串。例如:
s.compare {pos,n, s2);
若参与比较的两个串值相同,则函数返回 0;若字符串 S 按字典顺序要先于 S2,则返回负值;反之,则返回正值
#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.返回字符数量
a.size()
a.length()
12.返回字符的最大可能个数
a.max_size();
13.判断字符串是否为空
a.empty();
14.返回重新分配之前的字符容量
a.capacity()
15.保留内存以存储一定量的字符
a.reserve(大小)
并没有实际分配内存,影响capacity()
16.将内容复制为一个C-string
a.copy(p,n,size_type_Off=0);
从string对象中至多复制n个字符到字符指针p指向的空间中。默认从首字符开始。copy不会申请分配空间,所以用户要确保p指向的空间足够保存n个字符。
17.将内容以 C - string 形式返回
c_str();
返回一个指向某字符串的指针。
#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.将内容以字符数组形式返回
data()
与c_str()类似,但是返回的数组不以空字符终止。
#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中首个字符在str1中的地址
str1.find(str2);
str1.find(str2,5);
//在str1中查找字符c并返回第一个查找到的地址
str1.find(c);
//在str1中的第2个字符开始查找str2的前两个字符,并返回str2的首字符在str1中的位置
str1.find(str2,2,2);
rfind()
函数的原型和find()函数的原型类似,参数情况也类似。只不过 rfind() 函数适用于实现逆向查找
find_first_of()
函数可实现在源串中搜索某字符串的功能,该函数的返回值是被搜索字符串的第 1 个字符第 1 次出现的下标(位置)。若查找失败,则返回 npos。
find_last_of()
函数同样可实现在源串中搜索某字符串的功能。与 find_first_of() 函数所不同的是,该函数的返回值是被搜索字符串的最后 1 个字符的下标(位置)。若查找失败,则返回 npos。
find_first_not_of()
函数可实现在源字符串中搜索与指定字符(串)不相等的第 1 个字符
find_last_not_of()
函数可实现在源字符串中搜索与指定字符(串)不相等的最后 1 个字符。