|
Jan
06
|
|
总结一下C++中string的操作,来自〈C++ Primer〉第四版。
1. string对象的定义和初始化:
1 2 3 4 5 6 7 8 9 10 11 12 13 | string s1; //空串 string s2(s1); //将s2初始化为s1的一个副本 string s3("value"); //s3初始化并赋值 string s4(n,"c"); //s4初始化,赋值为n个'c' string s5(b,e); //初始化s5为迭代器b,e范围内的副本 string s6(cp); //用c风格的字符串初始化 string s7(cp,n); //cp前n个元素的副本 string s8(s2,pos2); //s8为s2从pos2开始到结尾的副本 string s9(s2,pos2,len2);//同上,不过的长度为len2(不超过s2的长度) //其中有一种方法需要注意: char no_null[] = {'H','i'}; string s10(no_null); //错误,不是以null结尾的串 string s10(no_null,2); //ok,可以自动添加null结尾 |
2. string的读写:
1 2 3 4 5 6 | string s; cin >> s; cout << s << endl; //注意,cin是会被空白符截断的 //要得到整行输入,采用while循环,或者: getline(cin,s); |
3.string的操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | s.empty(); //判断s是否为空,相当于s.size()==0 s.size(); //s的长度 s[n]; //n位置的字符(左值返回) s1+s2; //返回s1和s2连接的串 s1=s2; //把s1替换为s2的副本 s1==s2; //判断s1,s2是否相等 !=,<,<=,>,>= //按字典顺序比较 //================== s.insert(p,t); //在迭代器p指向的元素前插入t,返回指向t的迭代器 s.insert(p,n,t);//同上,插入n个t,返回void s.insert(p,b,e);//插入迭代器b,e间的元素,返回void s.insert(pos,n,c); //在pos前插入n个字符c,返回s的引用 s.insert(pos,s2);//在pos前插入s2,返回s的引用 s.insert(pos,s2,pos2,len); //在pos前插入s2中从pos2开始的len个字符,返回s的引用 s.insert(pos,cp,len); //pos前插入cp数组(c风格字串)的前len个字符,返回s的引用 s.insert(pos,cp);//在pos前插入cp,返回s的引用 //================== s.assign(b,e); //用b,e间的元素替换s,返回s s.assign(n,t); //用n个t替换s,返回s s.assign(s2); //用s2的副本替换s,返回s的引用 s.assign(s2,pos2,len); //用s2从pos2开始的len长的副本替换s,返回s的引用 s.assign(cp,len)//用cp的前len个字符副本替换s,返回s的引用 s.assign(cp) //用cp的副本替换s,返回s的引用 //================== s.erase(p); //删除迭代器p指向的元素,返回指向后一个元素的迭代器 s.erase(b,e); //删除b,e间的元素,返回值同上 s.erase(pos,len);//删除从pos开始的len个字符,返回s的引用 //================== s.substr(pos,n);//返回s中从pos开始的n个字符组成的串 s.substr(pos); //返回s中从pos开始到结尾的串 s.substr(); //返回s的副本 //================== s.append(args); //将args串接在s的后面,返回s的引用 //================== s.replace(pos,len,args); //删除s中从pos开始的len个字符,用args串替换,返回s的引用 //args不能为b2,e2 s.replace(b,e,args); //删除迭代器b,e范围内的字符,用args替换,返回s的引用 //args不能为s2,pos2,len2 //==================append,replace的args的说明 s2 //string s2,pos2,len2 //s2中下pos2开始的len2个字符 cp //c风格的串 cp,len2 //cp指向以空结束的前len2个字符 n,c //字符c的n个副本 b2,e2 //迭代器b2,e2范围内的所有字符 |
4.string的查找操作:
1 2 3 4 5 6 7 8 9 10 11 | s.find(args); //args的第一次出现 s.rfind(args); //最后一次出现 s.find_first_of(args);//args中任意字符的第一次出现 s.find_last_of(args);//args中任意字符的最后一次出现 s.find_first_not_of(args);//查找第一个不属于args的字符 s.find_last_not_of(args);//查找最后一个不属于args的字符 //=================args c,pos=0 //查找字符c,默认从s的0位置开始 s2,pos=0 //查找s2 cp,pos=0 //查找cp(c风格字串) cp,pos,n //从s的pos开始查找cp的前n个字符,没有默认值 |
5.string的比较:
除了刚才提到的等号及不等号的比较,c++还提供了一个比较函数compare
1 2 3 4 5 6 7 8 | s.compare(s2); //比较s和s2 s.compare(pos1,n1,s2);//s从pos1开始的n1个字符与s2比较 s.compare(pos1,n1,s2,pos2,n2); //s从pos1开始的n1个字符与s2从pos2开始的n2个字符比较 s.compare(cp); //比较s和cp s.compare(pos1,n1,cp); //s从pos1开始的n1个字符与cp比较 s.compare(pos1,n1,cp,n2); //s从pos1开始的n1个字符与cp的前n2个字符比较 //compare的返回值: >0 s大; <0 s小; =0 二者相等 |
6.cctype提供的字符判断函数:
需要包含头文件: #include<cctype>
1 2 3 4 5 6 7 8 9 10 11 12 13 | isalnum(c); //true if c 是数字或字母 isalpha(c); //true if c 是字母 iscntrl(c); //true if c 是控制字符 isdigit(c); //true if c 是数字 isgraph(c); //true if c 不是空格但可打印 islower(c); //true if c 是标点符号 isprint(c); //true if c 是空白字符 ispunct(c); //true if c 是大写字母 isspace(c); //true if c 是空白字符 isupper(c); //true if c 是大写字符 isxdigit(c); //true if c 是十六进制数 tolower(c); //将c转换为小写 toupper(c); //将c转换为大写 |
这篇文章来自 迷途知返(PWWANG.COM), 转载请注明出处。 版权说明


嘿嘿… 总结得挺好,用得不是很多,一般都只用CSTRING与CHAR,CHAR*
string功能还不少,最麻烦就是转型了
但STL用得更少了…
pwwang原来也玩C++的…
这个就看个人习惯了,有人习惯了用char*,有人习惯用string,至少转换嘛,这个设计语言的人早就想到了。
PS:好像我用C++很出乎你的意料?
加个类似php中的trim函数:
//trim a string
string trim(const string& str){
string s=str;
//trim left
if(s.find(” “)==0){s=trim(s.substr(1));}
//trim right
if(s.rfind(” “)==s.size()-1){s=trim(s.substr(0,s.size()-1));}
return s;
}
学ACM时写代码都喜欢了c的,虽然每次建的都是cpp文件,就是转不过来,string其实很强大,总结的很好。
最近在看英文版的《TC PL》在。