C_串----基本string字符系列容器

来源:互联网 发布:淘宝卖家查看退款记录 编辑:程序博客网 时间:2024/05/19 21:00




String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.

//这样操作之后s1是"abc",s2是"def".

a 和 b 是不是指向同一个地址呢,这个问题在各论坛都是谈论很激烈,其实很简单,跟下这些字符串的内存地址就好了

a的地址指向02A62208h,b的地址也是02A62208h,这说明了什么,创建b的时候.net机制肯定是先去查找内存中是否有这个字符串的内存地址,如果有则指向,没有才创建(来自360百度百科。)


C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,它提供了添加、删除、替换、查找和比较等丰富的方法。


String基本操作函数定义:

#include<string>#include<iostream>using namespace std;string::iterator it;//定义迭代器变量 string s,childs;/*尾部添加字符*/s.append(childs);s+=childs;/*删除字符*/int num,num1,num2; it=begin;s.erase(it+num);//删除第num个元素,数组从0开始计数s.erase(it+num1,it+num2);//删除第num1到num2区间所有元素,数组从0开始计数/*返回字符串长度*/s.length();/*替换string对象的字符*/int n;int num;s.replace(n,num,childs);//从第n个开始将连续的num个字符替换为childs字符串/*搜索子串或字符,查找到返回下标值,查找不到返回4294967295*/s.find(childs); /*string对象的比较*/s.compare(childs);//返回-1则s<childs,返回0则s=childs,返回1则s>childs/*反向排序string*/reverse(s.begin(),s.end()); 


scanf的输入速度比cin快很多

scanf()是C语言的函数,不支持string对象

1、从string对象尾部添加字符:

(1)直接采用"+"操作符,代码如下:

#include<string>#include<iostream>using namespace std;int main(){string s;s=s+"abc";s=s+"123";cout<<s<<endl; //abc123 return 0; }

(2)采用append()方法,代码如下:

#include<string>#include<iostream>using namespace std;int main(){string s;s.append("abc"); s.append("123");cout<<s<<endl; //abc123 return 0; }


2、给String对象插入字符:

#include<string>#include<iostream>using namespace std;int main(){string s;s="123456";//定义迭代器 string::iterator it;//迭代器位置为字符串首it=s.begin();//把字符'p'插入到第1个字符前(字符位置从0开始计数)s.insert(it+1,'p');cout<<s<<endl;//1p23456 return 0; }

3、访问string对象的元素:

一般使用下标方式随机访问string对象的元素,下标是从0开始计数的。另外,string对象的元素是一个字符(char),代码如下:


#include<string>#include<iostream>using namespace std;int main(){string s;s="abc123456";//输出string对象的首元素cout<<s[0]<<endl;//a//两个相同的字符相减值为0cout<<s[0]-'a'<<endl; //0return 0; }

4、删除string对象的元素:

(1)清空一个空字符串,则直接给它赋空字符串即可。

(2)使用erase()方法删除迭代器所指的那个元素或一个区间中的所有元素。代码如下:

#include<string>#include<iostream>using namespace std;int main(){string s;s="abc123456";//定义迭代器变量,指向字符串对象首元素string::iterator it=s.begin();//删除第3个元素,元素位置从0开始计数s.erase(it+3);cout<<s<<endl;//abc23456//删除0-4区间的所有元素s.erase(it,it+4);cout<<s<<endl;//3456//清空字符串s="";//输出字符串的长度cout<<s.length()<<endl;//0 return 0; }

5、返回string对象的长度

采用length()方法可返回字符串的长度;采用empty()方法,可返回字符串是否为空,如果字符串为空,则返回逻辑真,为1,否则,返回逻辑假,即0。代码如下:

#include<string>#include<iostream>using namespace std;int main(){string s;s="abc123456";//输出字符串的长度 cout<<s.length()<<endl;//清空字符串s=""; //(空的空格也算字符)//判断字符串是否为空cout<<s.empty()<<endl;return 0; }


6、替换string对象的字符

使用replace()方法可以很方便地替换string对象中的字符,replace()方法的重载函数相当多,常用的只有一两个,具体代码如下:

#include<string>#include<iostream>using namespace std;int main(){string s;s="abc123456";//从第3个开始,将连续的3个字符替换为"good" //即将"abc"替换为"good"s.replace(3,3,"good");cout<<s<<endl;//abcgood456return 0; } 


7、搜索string对象的元素或子串

采用find()方法可查找字符串中的第一个字符元素(char)或者子串(用双引号来界定),如果查找到,则返回下标值(),如果查不到,则返回4294967295,这个值是int能存储下的最大整数,4294967295+1在int类型里面得到结果是0。

#include<string>#include<iostream>using namespace std;int main(){string s;s="cat dog cat";//查找第一个字符'c',返回下标值cout<<s.find('c')<<endl;//0//查找第一个子串'c',返回下标值cout<<s.find("c")<<endl;//0 //查找第一个子串"cat",返回下标值 cout<<s.find("cat")<<endl;//0 //查找第一个子串"dog",返回下标值 cout<<s.find("dog")<<endl;//0 //查找第一个子串"dogc",查找不到则返回4294967295 cout<<s.find("dogc")<<endl; //4294967295return 0; } 


8、string对象的比较

string对象可与使用compare()方法与其他字符串相比较。如果它比对方大,则返回1,如果它比对方小,则返回-1,;如果它与对方相同(相等),则返回0

#include<string>#include<iostream>using namespace std;int main(){string s;s="cat dog cat";//s比"cat"字符串大,返回1cout<<s.compare("cat")<<endl;//1 //s与"cat dog cat"相等,返回0cout<<s.compare("cat dog cat")<<endl;//1//s比"dog"小,返回-1cout<<s.compare("dog")<<endl;//1return 0; }

(在编译器MinGW上可能返回大于1的值,只要是大于0就表示真)

9、用reverse反向排序string对象

采用reverse()方法可将string对象迭代器所指向的一段区间中的元素(字符)反向排序。reverse()方法需要声明头文件#include<algorithm>

#include<string>#include<iostream>#include<algorithm>//算法 using namespace std;int main(){string s;s="123456789";reverse(s.begin(),s.end());cout<<s<<endl;//987654321return 0;}


嗯下面就是在VC中基本操作的实现:

#include<string>#include<iostream>#include<algorithm> using namespace std;int main(){int ch; string s,s1,s2;string::iterator it; printf("请输入字符串S:");cin>>s; printf("*******************************\n");printf("1、添加字符\n2、删除字符\n3、返回串长\n");printf("4、访问字符\n5、判空字符\n6、替换字符\n");printf("7、搜素子串\n8、串的比较\n9、反向排列\n");printf("0、退出操作");printf("*******************************\n");printf("选择要进行的操作:");while(scanf("%d",&ch)&&ch!=0){if(ch==1){printf("请输入插入的字符:");cin>>s1;s+=s1;//s.append(s1); cout<<"生成新的字符串:"<<s<<endl; }if(ch==2){int n;it=s.begin();printf("输入要删除字符的位置:");scanf("%d",&n);s.erase(it+n-1);cout<<"生成新的字符串:"<<s<<endl; }if(ch==3){cout<<"串的长度为:"<<s.length()<<endl;}if(ch==4){int n;printf("请输入要访问第几个字符:");scanf("%d",&n);cout<<s[n-1]<<endl;}if(ch==5){if(!s.empty())printf("此时不是空字符串!\n");elseprintf("此时是空字符串!\n");}if(ch==6){int n,m;printf("请输入要替换的字符:");cin>>s1;printf("请输入要替换的起始位置:");scanf("%d",&n);printf("请输入要替换原始字符的个数:");scanf("%d",&m);s.replace(n,m,s1); cout<<"生成新的字符串:"<<s<<endl; }if(ch==7){printf("请输入要搜索的子串:");cin>>s1;cout<<s.find(s1)<<endl;}if(ch==8){printf("请输入要比较的两个字符串!\n");printf("请输入字符串S1:");cin>>s1;printf("请输入字符串S2:");cin>>s2;if(s1.compare(s2)<0){printf("字符串S1<S2\n");}else if(s1.compare(s2)==0){printf("两字符串相等\n");}else{printf("字符串S1>S2\n");}}if(ch==9){reverse(s.begin(),s.end());cout<<s<<endl;}printf("选择要进行的操作:");}printf("成功退出程序!\n");return 0;}

(参考书籍:ACM程序设计)



原创粉丝点击