标准库类型string表示可变长的字符序列,为了在程序中使用string类型,我们必须包含头文件: #include <string>
- 声明一个字符串
- 声明一个字符串有很多种方式,具体如下
string s;//调用默认构造函数,s为一个空字符串
string s(str);//等价于string s = str;调用拷贝构造函数,s是str的备份
string s(str,strindex);//将字符串str内始于strindex位置的部分当作s的初始值
eg.string str = "123456789";
string s(str,3);//s的初值为str由位置3开始的字符串,即456789
string s(str,stridx,strlen); // 将字符串str由stridx位置起始且长度为strlen的部分最为s的初值,如果strlen大于最大长度,则只截取字符串最大长度
eg.string s(str,3,10);//s=456789,由位置3开始,截取长度为10的部分,由于str剩余部分长度小于10,则截取str剩余最大长度
string s(cstr);//将C风格字符串作为s的初值
eg.string s("hello");//s的初值为hello
string s(cstr,length);//将C风格字符串的length长度部分作为s的初值
eg.string s("hello",2);//s="he"
string s(num,c);//生成一个字符串,包含num个c字符
eg.string s(10,'c');//s的初值为“cccccccccc”
字符串操作函数
- c++字符串的操作函数很多,这里把常用的罗列出来
=、assign()//用于赋予新值,assign函数用于将一个字符串的部分内容赋值给另一个string对象
eg.string s1 = "hello";
string s2;
s2.assign(s1,0,3);//s2的值为“hel”
swap() //交换两个字符串的内容
eg.string s1 = "hello";
string s2 = "world";
swap(s1,s2);//swap函数将s1和s2的内容交换,现在s1="world",s2="hello"
+=、append()、push_back()//在字符串尾部追加内容,"+="可追加string对象,字符以及C风格字符串,append函数则可以追加string对象和C风格字符串,push_back函数则只能追加字符
eg.string s1 = "hello";
string s2 = " world";
s1 += s2;//正确,s1的值为”hello world“
s1 +="world";// 正确,s1的值为"hello world"
s1 +='c'; //正确,s1的值为"helloc"
s1.append(s2);//正确,s1的值为"hello world"
s1.append(" world");//正确,s1的值为"hello world"
s1.append('c');//错误,append函数不支持追加字符
s1.push_back(s2);//错误
s1.push_back("world");//错误
s1.push_back('c');//正确
insert()//用于插入字符串
eg.string s1 = "hello";
s1.insert(0,"world ");//s1的值为world hello
erase()//用于删除字符的
eg.string str("This is an example phrase.");
string::iterator it;//迭代器
str.erase(10,8);//str的值为"This is an phrase.",删除了从位置10开始的8个字符
it = str.begin()+9;//迭代器位置为9
str.erase(it);//删除了从it迭代器位置处的一个字符,str="This is a phrase."
str.erase(str.begin()+5,str.end()-7);//删除两个参数之间的所有字符,str="This phrase."
clear()函数和~string()//都是用来删除全部字符的
eg.str.clear();//删除str的全部字符,此时str为一个空串
str.~string();//销毁所有字符,释放内存
replace()函数,用于替换字符
eg.1.string line = "this@ is@ a test string!";
line = line.replace(line.find("@"),1,"");//将line中从find的@位置开始替换一个长度的字符为"" 结果为this is@ a test string!
==、!=、<、<=、>、>=、compare()//比较字符串
eg.string s1 = "haha";
string s2 = "haha";
if(s1.compare(s2) == 0){
cout << "相等" << endl;
}
size()函数和length()函数,返回字符串的字符数
eg.string str = "haha";
str.size() 等于 str.length(),值均为4
empty()//判断字符串是否为空
下标法str[index]或者str.at(index)获取字符串内指定位置的字符
data()函数,将内容以字符数组的形式返回
- C++字符串和C字符串的转换
- C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加'\0'.
- c_str()返回一个以'\0'结尾的字符数组
- copy()则把字符串的内容复制或写入已有的c_string或字符数组内
- 元素存取
- 我们可以使用下标操作符[]和函数at()来对字符串的字符进行访问,但是应该注意的是下标操作符并不会检查索引是否有效,如果索引失效,会引起未定义的行为
- at()函数则会检查索引,如果索引失效会抛出out_of_range异常
- 注意,操作符可取到字符串尾部的'\0'字符
函数名 描述 begin 得到指向字符串开头的Iterator end 得到指向字符串结尾的Iterator rbegin 得到指向反向字符串开头的Iterator rend 得到指向反向字符串结尾的Iterator size 得到字符串的大小 length 和size函数功能相同 max_size 字符串可能的最大大小 capacity 在不重新分配内存的情况下,字符串可能的大小 empty 判断是否为空 operator[] 取第几个元素,相当于数组 c_str 取得C风格的const char* 字符串 data 取得字符串内容地址 operator= 赋值操作符 reserve 预留空间 swap 交换函数 insert 插入字符 append 追加字符 push_back 追加字符 operator+= += 操作符 erase 删除字符串 clear 清空字符容器中所有内容 resize 重新分配空间 assign 和赋值操作符一样 replace 替代 copy 字符串到空间 find 查找 rfind 反向查找 find_first_of 查找包含子串中的任何字符,返回第一个位置 find_first_not_of 查找不包含子串中的任何字符,返回第一个位置 find_last_of 查找包含子串中的任何字符,返回最后一个位置 find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置 substr 得到字串 compare 比较字符串 operator+ 字符串链接 operator== 判断是否相等 operator!= 判断是否不等于 operator<</td> 判断是否小于 operator>> 从输入流中读入字符串 operator<< 字符串写入输出流 getline 从输入流中读入一行