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
//两个相同的字符相减值为0
cout<<s[0]-'a'<<endl; //0
return 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;
}
使用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; //abcgood456
return 0;
}
采用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; //4294967295
return 0;
}
string对象可与使用compare()方法与其他字符串相比较。如果它比对方大,则返回1,如果它比对方小,则返回-1,;如果它与对方相同(相等),则返回0
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s="cat dog cat";
//s比"cat"字符串大,返回1
cout<<s.compare("cat")<<endl; //1
//s与"cat dog cat"相等,返回0
cout<<s.compare("cat dog cat")<<endl; //1
//s比"dog"小,返回-1
cout<<s.compare("dog")<<endl; //1
return 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; //987654321
return 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");
else
printf("此时是空字符串!\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程序设计)