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




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; 
}


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;		//abcgood456
	return 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; 	//4294967295
	return 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"字符串大,返回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程序设计)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值