1.包含头文件string,使用命名空间;
2.声明和定义string。
![1.png](http://studygolang.qiniudn.com/161009/0d053d9e9c611ba9197e4a6afeeb5482.png)
1)声明一个string类型的变量str1;
2)声明并定义一个string类型的变量str2;
3)声明并定义一个string类型的变量str3;
4)声明并定义一个string类型的变量str4;
5)声明并定义一个string类型的变量str5,它的值为十个a;
6)利用变量str5创建str6,两个变量是一样的内容。
3.字符串的加法
![2.png](http://studygolang.qiniudn.com/161009/53f25a9f0efb671dbb8a72770fd553e3.png)
字符串的加法操作将字符串连接,加号后面的字符串会拼接到前面的字符串后面。前面两种都至少有一个string变量,加法连接无法连接两个string类型的常量。所以加法操作的正确做法就是保证两个操作数中至少有一个string变量。
4.字符串的比较
这些表达式会返回一个bool类型的值。
![3.png](http://studygolang.qiniudn.com/161009/bd9ede0c0ec1a0d312d5b9fb27e4d5ad.png)
5.字符串的一些常用方法
Size() //返回字符串的长度Str[n]; //下标访问数据,0~n~size-1empty() // 判断字符串是否为空
6.字符串的实例
文本编辑器:创建一个程序,将我们输入的每一行的数据拼接到一个字符串后面。
测试代码如下:
#include//输入输出流的包含#include//string类的包含using namespace std; //命名空间的使用int main() {String str; //接收我们输入的所有字符串String str1; //保存每一行的字符串,用来拼接到str后面int nLine=0; //统计我们输入的行数while(getline(cin,str1)) { //getline(cin,str1)是一个有两个参数的每一获取一行字符串的函数,cin代表它是从输入流中读取数据,str1是将读取的一行数据保存到str1中 if(str1==”q”) { //如果我们输入q,就停止输入 break; //跳出循环}str+=str1; str+=”\n”; //字符串的拼接,由于str1中是不会将换行符读取进去的,所以为了输出的时候保持我们输入时候的每一行格式,我们手动在输入的每一行字符后面添加一个换行符保存在每一行后面,换行符也是一个字符,这样输出的时候会自动换行nLine ++; //统计行数}cout<<”total chars:”<<str.size()<<”total lines:”<<nLine<<endl; //输出字符总数及行数cout <<str<<endl;return 0;}
运行结果如下:不知道大家注意到一个细节没有,我们输入了23个字符,size函数统计结果显示为26个,还有三个字符就是我们行末尾的换行符。我们前面就提到过,C风格的字符串的结尾中总是有一个结尾标志\0,如果我们对c风格的字符串使用cout输出,可以预想它遇到\0是会认为这个字符串已经结束了,但是这里对string类型的字符串就没有结束标志,只会按照字符串的大小来输出。
![4.png](http://studygolang.qiniudn.com/161009/423c749935130369f139e744014a4a40.png)
string是一个类,它的内部也是使用c风格的字符串来实现的,可以用一个方法来获得它的C风格的字符串的常量指针。String类型的字符串的长度是可以自动增加的,当我们在对字符串进行拼接时,如果它原来的的空间不够,会自动销毁这一片空间,然后重新分配一段更大的空间。String类的内部是可以自动管理内存的释放和分配的。如果一旦内存进行了重新分配和释放,那么你原来获得的常量指针指向的地址就是无效的了,这个时候你对p的操作就是有风险的,所以说我们尽量不要去使用它。
const char *p=str.c_str(); //返回的是常量字符指针,所以只能读不能写
原文链接:http://www.maiziedu.com/wiki/cplus/string/
有疑问加站长微信联系(非本文作者)