首页 > 代码库 > C++ String类

C++ String类

1、设计String类

//C++ 设计String类:构造函数,拷贝构造函数,析构函数,赋值函数

#include<iostream>
using namespace std;

class String
{
public:
	String(const char *str=NULL);
	String(const String&another);
	~String();
	String&operator=(const String& rhs);
private:
	char* m_data;
};

String::String(const char *str)
{
	if(NULL==str)
	{
		m_data=http://www.mamicode.com/new char[1];>

2、append()

//C++ append()函数|C++ 一个字符串连接在另一个字符串后面【C++ string】

#include<iostream>

#include<string>

using namespace std;

void main()

{

string a="www.ok2002.com";

string b=" study C++ program";

a.append(b,0,sizeof(b)+2);

cout<<a<<endl;

}

当程序运行的时候,上面的代码将执行输


3、assign()


//C++ assign()函数|C++ 从第二个字符开始保留6个字符,其它字符删去【C++ string】
#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a,b="123456789";
	a.assign(b,2,6);//从第二个字符开始保留6个字符,其它字符删去
	cout<<a<<endl;//输出:345678
}



4、at()

//C++ 更安全的向量元素访问方式 | C++ at()成员函数【C++ 用at()成员函数访问向量元素,是一种安全的访问方式,可以有效地避免错误代码的继续执行】

//以下程序使用at()成员函数访问向量元素,是一种安全的访问方式,可以有效地避免错误代码的继续执行
#include<iostream>
#include<string>
#include<vector>
using namespace std;

void main()
{
	int n[]={1,2,3};
	vector<int>a(n,n+sizeof(n)/sizeof(int));

	//错误的代码:这里试途访问不存在的第四个和第五个元素,
	for(int i=0;i<5;i++)
	{
		cout<<a.at(i)<<' ';//当程序试途访问第四个元素时,系统弹出错误提示对话框,并停止往下执行
		//cout<<a[i]<<' ';//不安全的访问方法,
	}
	cout<<endl;
}
 


5、C++capacity() | C++ reserve()

//C++capacity() | C++ reserve()

#include<iostream>
#include<string>
#include<vector>
using namespace std;

void show(vector<int>rs)
{
	vector<int>::iterator u;
	for(u=rs.begin();u!=rs.end();u++)
		cout<<*u<<' ';
	cout<<endl;
}

void main()
{
	vector<int>a(10);
	cout<<a.capacity()<<endl;//向量a的空间大小:10
	show(a);//输出10个元素,第个元素都是0

	vector<int>b;
	b.reserve(20);//分配空间
	cout<<b.capacity()<<endl; //向量b的空间大小:20
	show(b);//?????为什么只输出一个换行,其它什么都没有呢?
}


6、clear()

//C++ clear()清空元素| C++ 删除链表全部元素

#include<iostream>
//#include<string>
//#include<vector>
#include<list>
using namespace std;

void show(list<int>rs)
{
	list<int>::iterator u;
	for(u=rs.begin();u!=rs.end();u++)
		cout<<*u<<' ';
	cout<<endl;
}

void main()
{
	list<int>a;
	a.push_back(1);
	a.push_back(2);
	a.push_back(3);
	show(a);//输出元素:1 2 3 并且换行
	a.clear();//清空所有元素/删除链表全部元素
	show(a);//输出换行,没有元素
}


7、compare() 

//C++ compare() | C++ 两个字符串相同时返回0 | C++ 与长度比它短的字符串相比较时返回1| C++ 与长度比它长的字符串相比较时返回-1 

#include<iostream>
#include<string>
//#include<vector>
//#include<list>
using namespace std;

void main()
{
	string a="ok2002.com";
	string b="2002";
	string c="ww11ok15011com";

	cout<<a.compare(b)<<endl;//与长度比它短的字符串相比较时返回1
	cout<<a.compare(c)<<endl;//与长度比它长的字符串相比较时返回-1

	cout<<b.compare(a)<<endl;//-1
	cout<<b.compare(c)<<endl;//-1

	cout<<c.compare(a)<<endl;//1
	cout<<c.compare(b)<<endl;//1

	cout<<a.compare(a)<<endl;//两个字符串相同时返回0
	cout<<b.compare(b)<<endl;//0
	cout<<c.compare(c)<<endl;//0
	cout<<c.compare("ww11ok15011com")<<endl;//0
}

8、c_str() 

//C++ c_str()成员函数输出字符串【C++ string|C++ 定义string变量并且初始化该变量|C++ 初始化string变量】

#include<iostream>
#include<string>
//#include<vector>
using namespace std;

void main()
{
	string a("hello,OK2002.com!");//定义string变量a并且初始化该变量
	cout<<a.c_str()<<endl;//输出string变量a:hello,OK2002.com!

	string b;//定义string变量
	b="ok1500.com";//初始化string变量
	cout<<b.c_str()<<endl;//输出string变量b:ok1500.com
}


9、C++ copy()| C++ memset()

//C++ 将一个字符串中的指定字符复制到数组中【C++ copy()| C++ memset()】

#include<iostream>
#include<string>
//#include<vector>
//#include<list>
using namespace std;

void main()
{
char a[30];
memset(a,'\0',30);
string str="1234567890";
str.copy(a,5);//在string变量str中复制5个字符到数组a中
cout<<a<<endl;
}


10、data()

//C++ 返回字符串的第一个字符【C++ data()】

#include<iostream>
#include<string>
//#include<vector>
//#include<list>
using namespace std;

void main()
{
	string a="ok2002.com";
	cout<<*a.data()<<endl;//*a.data()返回a字符串的第一个字符'o'

	string b="hello";
	cout<<*b.data()<<endl;//*b.data()返回b字符串的第一个字符'h'
}


11、拷贝构造函数

//C++ 拷贝构造函数,生成某一字串的复制品【C++ string】

#include<iostream>
#include<string>
//#include<vector>
//#include<list>
using namespace std;

void main()
{
	string a="ok2002.com";
	string b(a);//拷贝构造函数,生成a字串的复制品
	cout<<b<<endl;
	cout<<a<<endl;
}



12、创建string时生成N个相同字符的字符串|C++ 改变string变量a的值


//C++ 创建string时生成N个相同字符的字符串|C++ 改变string变量a的值【C++ string】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a(10,'A');
	cout<<a<<endl;
	//a(20,'B');//这种是不对的,必须在创建string时生成N个相同字符的字符串
	a="ABCD";//如果想改变string变量a的值,可以这样做
	cout<<a<<endl;
}


13、string b(a.begin(),a.end());复制


#include<iostream>
#include<string>
using namespace std;

void main()
{
string a="www.ok2002.com";
string b(a.begin(),a.end());//以区间a.begin()和a.end()(不包含a.end())内的字符作为字符串b的初值
cout<<b<<endl;
}



14、赋值

//C++ 字符串赋值的两种方式|C++ 初始化字符串变量【C++ string】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a;//定义string变量a

	a="hello";//将a初始化为 hello
	cout<<a<<endl;

	a.assign("ok2002.com");//把a赋值为 ok2002.com
	cout<<a<<endl;
}



15、swap() 交换

//C++ 交换两个字符串内容【C++ string | C++ swap()】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a="www.ok2002.com";
	string b="www.ok1500.com";

	cout<<"交换前:"<<endl;
	cout<<a<<endl;
	cout<<b<<endl;

	a.swap(b);//交换两个字符串内容

	cout<<"交换后:"<<endl;
	cout<<a<<endl;
	cout<<b<<endl;
} 


16、初始化字符串(两种方法) | C++ 创建string变量时赋值 |C++ string变量重新赋值【C++ string 】


//C++ 初始化字符串(两种方法) | C++ 创建string变量时赋值 |C++ string变量重新赋值【C++ string 】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	
	string a="ok2002.com";
	cout<<a<<endl;//输出:ok2002.com
	a="abc";//重新赋值
	cout<<a<<endl;//输出:abc

	string b("ok1500.com");
	cout<<b<<endl;//输出:ok1500.com
	b="hello";//重新赋值
	cout<<b<<endl;//输出:hello

} 


17、C++ insert()

//C++ 字符串中插入字符串【C++ string |C++ insert()】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a;
	a.insert(0,"OK");//在0的位置插入字符串 OK
	a.insert(2,"2002");//在2的位置插入字符串 2002
	a.insert(6,".");//在6的位置插入字符串 .
	a.insert(7,"com");//在7的位置插入字符串 com
	cout<<a<<endl;//输出本站网址:OK2002.com
} 


18、erase()


//C++ 从第一个字符开始保留指定个字符【C++ string |C++ erase()】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a="ABCD";
	a.erase(1);//从第一个字符开始保留1个字符
	cout<<a<<endl;//输出:A

	a="ABCD";
	a.erase(2);//从第一个字符开始保留2个字符
	cout<<a<<endl;//输出:AB

	a="ABCD";
	a.erase(3);//从第一个字符开始保留3个字符
	cout<<a<<endl;//输出:ABC
}


19、max_size()

//C++ 字符的可能最大个数 【C++ string | C++ max_size()】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a="AA";
	cout<<a.max_size()<<endl;

	string b="www.ok2002.com";
	cout<<b.max_size()<<endl;
}

/*--------------------测试结果:
4294967293
4294967293
Press any key to continue
---------------------------*/
 



20、C++ capacity()

//C++ 重新分配之前的字符容量【C++ string | C++ capacity()】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a="AA";
	cout<<a.capacity()<<endl;//返回重新分配之前的字符容量

	string b="www.ok2002.com";
	cout<<b.capacity()<<endl;//返回重新分配之前的字符容量
}

/*--------------------测试结果:
31
31
Press any key to continue
---------------------------*/

21、C++ reserve() |C++ capacity()


//C++ 保留一定量内存以容纳一定数量的字符【C++ string | C++ reserve() |C++ capacity()】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a="AA";

	cout<<a.capacity()<<endl;//31 返回重新分配之前的字符容量

	a.reserve(100);//保留一定量内存以容纳一定数量的字符
	cout<<a.capacity()<<endl;//127

	a.reserve(20);
	cout<<a.capacity()<<endl;//127

	a.reserve(300);
	cout<<a.capacity()<<endl;//319
}


22、串联字符串

//C++ 串联字符串【C++ string】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string b;
	b=b+"AA"+"BB"+"CC";//串联字符串
	cout<<b<<endl;//输出:AABBCC

	string a="Hello,";
	a=a+"OK"+"2002"+".com!";//串联字符串
	cout<<a<<endl;//输出:Hello,OK2002.com!
}



23、C++ size()| C++ length() 

//C++ 字符数量 | C++ 字符个数【C++ string | C++ size()| C++ length() |本实验中size()和length()表示出一至的特性】


#include<iostream>
#include<string>
using namespace std;


void main()
{
	string a="AA";
	string b="ABCD";
	cout<<a.size()<<" "<<b.size()<<endl;//2 4
	cout<<a.length()<<" "<<b.length()<<endl;//2 4
}


24、C++ at() |C++ [ ]


//C++ 存取单一字符|C++ 访问一个字符(两种访问方式)【C++ string | C++ at() |C++ []】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a="ABCD";

	//第一种访问方式(更安全,能检查出不存在的元素并且发现错误时可以有效阻止错误程序的继续执行)
	cout<<a.at(0)<<endl;//A
	cout<<a.at(1)<<endl;//B
	cout<<a.at(2)<<endl;//C
	cout<<a.at(3)<<endl;//D

	cout<<endl;

	//第二种访问方式
	cout<<a[0]<<endl;//A
	cout<<a[1]<<endl;//B
	cout<<a[2]<<endl;//C
	cout<<a[3]<<endl;//D
}


25、getline()

//C++ 从键盘输入中读取一行字符串【C++ getline()】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	char b[100];
	cout<<"请输入一行字符串:"<<endl;
	cin.getline(b,' '); 
	cout<<b<<endl;
}

26、C++ >> | C++ <<

//C++ 从stream读取某值|C++ 将谋值写入stream【C++ >> | C++ <<】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	char b[100];
	cout<<"请输入一行字符串:"<<endl;
	cin.getline(b,' '); 
	cout<<b<<endl;

	//输入string类型的变量值
	string a;
	cout<<"input a string:"<<endl;
	cin>>a;
	cout<<a<<endl;
	
	//输入int类型的变量值
	int x;
	cout<<""<<endl;
	cin>>x;
	cout<<x<<endl;
}

27、substr()

//C++ 从某个字符开始的所有字符 | C++ 子字符串【C++ substr()】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string s("123456789ABC");
	string sub=s.substr(8);//返回从第8+1个元素开始的所有字符
	cout<<s<<endl;
	cout<<sub<<endl;
}



28、C++ data() | C++ c_str()


//C++ 将内容以字符数组形式返回|C++ 将内容以C_string返回【C++ data() | C++ c_str() | C++ string】

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a="ABC";
	cout<<a.data()<<endl;//将内容以字符数组形式返回,输出:ABC
	cout<<a.c_str()<<endl;//将内容以C_string返回,输出:ABC
}


29、C++ 类写的模板向量按不同数据项排序 sort()

//C++ 类写的模板向量按不同数据项排序 
#include<algorithm>
#include<iostream>
#include<vector>
#include<string>
using namespace std;

class DATA
{
public:
	int id;
	string name; 
};

class WAY
{
public:
	template<class T>
	void display(T&v)
	{
		typename T::iterator u;
		for(u=v.begin();u!=v.end();u++)
			cout<<u->id<<" "<<u->name<<endl;
		cout<<endl;
	}
};

bool greaterById(DATA &a,DATA &b)
{
	return a.id>b.id;
}

bool greaterByName(DATA &a,DATA &b)
{
	return a.name>b.name;
}

void main()
{
	int lastId=0;
	string name[]={"孔明","刘备","曹操","张飞","关羽","周俞","鲁肃"};
	int len=sizeof(name)/sizeof(string);
	vector<DATA>v;
	WAY way;
	DATA p;
	for(int i=0;i<len;i++)
	{
		p.id=++lastId;
		p.name.assign(name[i]);
		v.push_back(p);
	}
	way.display(v);

	cout<<"按name逆序排序:"<<endl;
	sort(v.begin(),v.end(),greaterByName);
	way.display(v);

	cout<<"按id逆序排序:"<<endl;
	sort(v.begin(),v.end(),greaterById);
	way.display(v);
}


30、C++ 检测越界功能的程序

//C++ 检测越界功能的程序 | C++ 数组访问方法增加检查下标越界功能 | C++ 重载运算符[]【没有越界时返回对应位置上的字符,越界时返回'#'】
#include<iostream.h>
#include<string.h>

class OP
{
	char *str;
	int len;
public:
	OP(char *a)
	{
		str=new char[strlen(a)+1];//在堆中申请内存
		strcpy(str,a);
		len=strlen(a);
	}
	~OP()
	{
		delete str;//析构函数中释放内存空间
	}
	char operator[](int i)
	{
		if(i>=len)
			return '#';//越界时返回'#'
		else
			return *(str+i);//没有越界时返回对应位置上的字符
	}
};

void main()
{
	OP str("www.ok2002.com");
	for(int i=0;i<20;i++)
		cout<<str[i];//没有越界时返回对应位置上的字符,否则将返回'#'
	cout<<endl;
}