提纲:
一:string型字符串声明,初始化和赋值: 1.string型字符串的声明和初始化方式: 2.string型字符串的声明和初始化的简单示例: 3.string字符串的赋值及其示例: 二:string型字符串的基本操作函数: 1.基本操作函数介绍: 2.基本操作函数示例:正文:
一:字符串基本操作函数和示例: 首先应该引入头文件如下: #include <iostream> #include <string> using namespace std; 说明: 如果包含非标准输入输出头文件iostream.h,编译会出错. string.h是C语言中字符串的头文件,不适用于C++. 1.string型字符串的声明和初始化方式: (1).使用默认构造函数声明一个字符串变量: string str; 说明:这种声明方式使用了string类的默认构造函数,没有传入参数.作用是声明一个空字符串. (2).string类的构造函数,拷贝构造函数和析构函数:构造函数
string s; //生成一个空字符串s string s(num,c) //生成一个字符串,包含num个c字符 string s(cstr) //将C字符串作为s的初值 string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。 string s(str,stridx) //将字符串str内"始于位置stridx"的部分当作字符串的初值 拷贝构造函数 string s(str); 生成str的复制品析构函数
s.~string() //销毁所有字符,释放内存 2.string型字符串的声明和初始化的简单示例: //string s; 生成一个空字符串s string str1; str1 = "ABCD"; //string s(str) 拷贝构造函数 生成str的复制品 string str2(str1); string str3("abcd"); //string s(num,c) 生成一个字符串,包含num个c字符 string str4(4,'a'); //string s(beg,end) 以区间beg;end(不包含end)内的字符作为字符串s的初值 //string str5('a','c'); //不知道为什么不能输出预期结果? //string s(cstr) 将C字符串作为s的初值 char *p = "ABCDEF"; char ch [] = "abcdef"; string str6(p); string str7(ch); //string s(chars,chars_len) 将C字符串前chars_len个字符作为字符串s的初值。 string str8(p,4); //string s(str,stridx) 将字符串str内"始于位置stridx"的部分当作字符串的初值 //应该是C语言的字符串str,string型字符串编译出错.截取前stridx个字符 string str9(ch,2); //string s(str,stridx,strlen) 将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值 //C语言字符串和string型字符串均可以,作用是从stridx位置开始截取最多strlen个字符. string str10(str8,1,4); //s.~string() 销毁所有字符,释放内存,再次输出时为空. str10.~string();二:string型字符串的基本操作函数:
1.基本操作函数介绍: (1).大小和容量函数: string字符串存在三种大小: a)现有的字符数:函数是size()和length(),它们差别不大,还有Empty()用来检查字符串是否为空。 b)max_size() :指当前C++字符串最多能包含的字符数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。我们一般情况下不用关心他,应该大小足够我们用的。但是不够用的话,会抛出length_error异常 c)capacity():重新分配内存之前string所能包含的最大字符数。这里另一个需要指出的是reserve()函数,这个函数为string重新分配内存。重新分配的大小由其参数决定, 默认参数为0,这时候会对string进行非强制性缩减。 (2).C++字符串和C字符串的转换函数: 可以使用data()、c_str()和copy()实现转化. data()函数: 以字符数组的形式返回字符串内容,但并不添加’\0’。 c_str()函数: 返回一个以‘\0’结尾的字符数组. copy()函数: 把字符串的内容复制或写入既有的c_string或字符数组内。C++字符串并不以’\0’结尾。 (3)元素存取函数: 我们可以使用下标操作符[]和函数at()对元素包含的字符进行访问。但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。而at()会检查,如果使用at()的时候索引无效,会抛出out_of_range异常。 有一个例外不得不说,const string a;的操作符[]对索引值是a.length()仍然有效,其返回值是’\0’。其他的各种情况,a.length()索引都是无效的。 (4).比较函数: C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较,(如str<"hello")。 在使用>,>=,<,<=这些操作符的时候是根据"当前字符特性"将字符按字典顺序进行逐一比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。 同时,string ("aaaa") <string(“aaaaa”)。另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。 返回一个整数来表示比较结果, 返回值意义如下:0-相等, 〉0-大于, <0-小于。 举例如下: string s("abcd"); s.compare("abcd"); //返回0 s.compare("dcba"); //返回一个小于0的值 s.compare("ab"); //返回大于0的值 s.compare(s); //相等 s.compare(0,2,s,2,2); //用"ab"和"cd"进行比较 小于零 s.compare(1,2,"bcx",2); //用"bc"和"bc"比较。 (5).更改内容函数: 赋值: 第一个赋值方法是使用操作符=, 如string str1 = "abcd"; string str2 = str1; 第二个赋值方法是使用assign函数: s.assign(str); // s.assign("gaint"); // s.assign(str,1,3);//如果str是"iamangel" 就是把"ama"赋给字符串 s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给s s.assign("nico",5);//把’n’ ‘I’ ‘c’ ‘o’ ‘\0’赋给字符串 s.assign(5,'x’);//把五个x赋给字符串 清空: 方法一:s=""; 方法二:s.clear(); 方法三:s.erase(); 增加字符: 方法一:+=、 方法二:append()、 方法三:push_back()。 举例如下: 方法一:+=、 s+=str;//加个字符串 s+="my name is jiayp";//加个C字符串 s+=’a’;//加个字符 方法二:append()、 s.append(str); s.append(str,1,3);// s.append(str,2,string::npos)// 方法三:push_back()。 s.push_back(‘a’);//这个函数只能增加单个字符 对STL熟悉的理解起来很简单