C++_enhance-Record15—STL中的字符串类(string)的典型操作

目录

 

String概念

string和char*的比较

string是一个类, char*是一个指向字符的指针。

string不用考虑内存释放和越界。

string提供了一系列的字符串操作函数

案例说明

string的初始化

 string的遍历

用数组方式进行遍历

用迭代器进行遍历

用"operator[]"或"at()"关键字进行遍历

字符指针和string的转换

s1===>char *

s1的内容 copy buf中

string的连接

string的查找和替换(重点)

案例1 求wbm出现的次数 每一次出现的数组下标

案例2  把小写wbm===>WBM

string的截断(区间删除)和插入

删除string里的指定数据

删除整个字符串

string的插入

string相关的算法

总体代码


String概念

  • string是STL的字符串类型,通常用来表示字符串。而在使用string之前,字符串通常是用char*表示的。string与char*都可以用来表示字符串,那么二者有什么区别呢。

string和char*的比较

string是一个类, char*是一个指向字符的指针。

string封装了char*,管理这个字符串,是一个char*型的容器。

string不用考虑内存释放和越界。

string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。

string提供了一系列的字符串操作函数

查找find,拷贝copy,删除erase,替换replace,插入insert

案例说明

string的初始化

//string的初始化
void main21()
{
	string s1 = "aaaa";
	string s2("bbbb");
	string s3 = s2; //通过拷贝构造函数 来初始化对象s3
	string s4(10, 'a');

	cout << "s1:" << s1 << endl;
	cout << "s2:" << s2 << endl;
	cout << "s3:" << s3 << endl;
	cout << "s4:" << s4 << endl;
}

如下如下:

C++_enhance-Record15—STL中的字符串类(string)的典型操作_第1张图片

 string的遍历

//string的 遍历
void main22()
{
	string s1 = "abcdefg";
	
}

用数组方式进行遍历

	//1 数组方式
	for (int i=0; i

用迭代器进行遍历

	//2 迭代器
	for (string::iterator it = s1.begin(); it != s1.end(); it++ )
	{
		cout << *it << " ";
	}
	cout << endl;

用"operator[]"或"at()"关键字进行遍历

operator[]和at()均返回当前字符串中第n个字符,但二者是有区别的。

主要区别在于at()在越界时会抛出异常,[]在刚好越界时会返回(char)0,再继续越界时,编译器直接出错。如果你的程序希望可以通过try,catch捕获异常,建议采用at()

	try
	{
		for (int i=0; i

同样的,如果用“[]”来进行,一旦出错,就会引起编译器的中断了。 出现错误,不会向外面抛出异常,会引起程序的中断。

	/*
	try
	{
		for (int i=0; i

字符指针和string的转换

void main23()
{
	string s1 = "aaabbbb";
}

s1===>char *

  • const char *c_str() const;   //返回一个以'\0'结尾的字符串的首地址
printf("s1:%s \n", s1.c_str());

s1的内容 copy buf中

  • int copy(char *s, int n, int pos=0) const; 

把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目。注意要保证s所指向的空间足够大以容纳当前字符串,不然会越界。

	char buf1[128] = {0};
	s1.copy(buf1, 3, 0);  //注意 只给你copy3个字符 不会变成C风格的字符串
	cout << "buf1:" << buf1 << endl; 

string的连接

  • 通过“+”操作符或".append()"命令,完成连接操作
//字符串的 连接
void main24()
{
	string s1 = "aaa";
	string s2 = "bbb";
	s1 = s1 + s2;
	cout << "s1:" << s1 << endl;

	string s3 = "333";
	string s4 = "444";
	s3.append(s4);
	cout << "s3:" << s3 << endl;
}

string的查找和替换(重点)

先创建一个字符串变量s1,实现需求:查找第一次出现"wbm“的数组下标

void main25()
{
	string s1 = "wbm hello wbm 111  wbm 222  wbm 333 ";
	//			 ▲
}

那么,运用"find"操作命令进行查找:

	int index = s1.find("wbm", 0); //位置下标 从0开始
	cout << "index: " << index << endl;

案例1 求wbm出现的次数 每一次出现的数组下标

思路:首先,对wbm进行一个检索,查出来之后,套入while循环,增加偏移量(+1)继续寻找,这样就可以找到了!

	int offindex = s1.find("wbm", 0);
	while (offindex != string::npos)
	{
		cout << "offindex:" << offindex << endl;
		offindex = offindex + 1;
		offindex = s1.find("wbm", offindex); //wang bao ming 
	}

案例2  把小写wbm===>WBM

在案例1的基础上,继续加大难度,用到了"replace"函数

  • string &replace(int pos, int n, const char *s);//删除从pos开始的n个字符,然后在pos处插入

跟上个案例一样,先找出wbm的位置,然后,再进行替换。

	string s3 = "aaa  bbb ccc";
	s3.replace(0, 3, "AAA");
	cout << "s3" << s3 << endl;

	offindex = s1.find("wbm", 0);
	while (offindex != string::npos)
	{
		cout << "offindex:" << offindex << endl;
		s1.replace(offindex,3, "WBM");
		offindex = offindex + 1;
		offindex = s1.find("wbm", offindex); //
	}
	cout << "s1替换后的结果: " << s1 << endl;

string的截断(区间删除)和插入

删除string里的指定数据

通过迭代器,找到对应的位置进行删除,注意,这个函数是在算法当中的,需要加"#include "algorithm"头文件。

  • string &erase(int pos=0, int n=npos);  //删除pos开始的n个字符,返回修改后的字符串
void main26()
{
	string s1 = "hello1 hello2 hello1";
	string::iterator it = find(s1.begin(), s1.end(), 'l');
	if (it != s1.end() )
	{
		s1.erase(it);
	}
	cout << "s1删除l以后的结果:" << s1 << endl;
}

删除整个字符串

	s1.erase(s1.begin(), s1.end() );
	cout << "s1全部删除:" << s1 << endl;
	cout << "s1长度 " << s1.length() << endl;

string的插入

根据插入位置的不同,插入分为头插法和尾插法。

	string s2 = "BBB";

	s2.insert(0, "AAA"); // 头插法
	s2.insert(s2.length(), "CCC");  //尾插法

	cout << s2 << endl;

string相关的算法

想将字符串中的内容,全部变成小写的(或大写的),可以用transform这个算法函数,通过设置不同的预定义的函数对象(toupper或tolower)来实现,

void main27()
{
	string s1 = "AAAbbb";
	//1函数的入口地址 2函数对象 3预定义的函数对象
	transform(s1.begin(), s1.end(),s1.begin(), toupper);
	cout << "s1" << s1 << endl;

	string s2 = "AAAbbb";
	transform(s2.begin(), s2.end(), s2.begin(), tolower);
	cout << "s2:" << s2 << endl;
}

总体代码

dm02_string的操练.cpp


#include 
using namespace std;
#include "string"
#include "algorithm"

//string的初始化
void main21()
{
	string s1 = "aaaa";
	string s2("bbbb");
	string s3 = s2; //通过拷贝构造函数 来初始化对象s3
	string s4(10, 'a');

	cout << "s1:" << s1 << endl;
	cout << "s2:" << s2 << endl;
	cout << "s3:" << s3 << endl;
	cout << "s4:" << s4 << endl;
}

//string的 遍历
void main22()
{
	string s1 = "abcdefg";

	//1 数组方式
	for (int i=0; ichar *
	//printf("s1:%s \n", s1.c_str());

	//2 char *====>sting 


	//3 s1的内容 copy buf中
	//char buf1[128] = {0};
	//s1.copy(buf1, 3, 0);  //注意 只给你copy3个字符 不会变成C风格的字符串
	//cout << "buf1:" << buf1 << endl; 
}

//字符串的 连接
void main24()
{
	string s1 = "aaa";
	string s2 = "bbb";
	s1 = s1 + s2;
	cout << "s1:" << s1 << endl;

	string s3 = "333";
	string s4 = "444";
	s3.append(s4);
	cout << "s3:" << s3 << endl;
}


//字符串的查找和替换
void main25()
{
	string s1 = "wbm hello wbm 111  wbm 222  wbm 333 ";
	//			 ▲
	//第一次 出现wbm index

	int index = s1.find("wbm", 0); //位置下标 从0开始
	cout << "index: " << index << endl;

	//案例1 求wbm出现的次数 每一次出现的数组下标
	int offindex = s1.find("wbm", 0);
	while (offindex != string::npos)
	{
		cout << "offindex:" << offindex << endl;
		offindex = offindex + 1;
		offindex = s1.find("wbm", offindex); //wang bao ming 
	}

	//案例2  把小写wbm===>WBM

	string s3 = "aaa  bbb ccc";
	s3.replace(0, 3, "AAA");
	cout << "s3" << s3 << endl;

	offindex = s1.find("wbm", 0);
	while (offindex != string::npos)
	{
		cout << "offindex:" << offindex << endl;
		s1.replace(offindex,3, "WBM");
		offindex = offindex + 1;
		offindex = s1.find("wbm", offindex); //
	}

	cout << "s1替换后的结果: " << s1 << endl;

}


//截断(区间删除)和插入
void main26()
{
	string s1 = "hello1 hello2 hello1";
	string::iterator it = find(s1.begin(), s1.end(), 'l');
	if (it != s1.end() )
	{
		s1.erase(it);
	}
	cout << "s1删除l以后的结果:" << s1 << endl;

	s1.erase(s1.begin(), s1.end() );
	cout << "s1全部删除:" << s1 << endl;
	cout << "s1长度 " << s1.length() << endl;

	string s2 = "BBB";

	s2.insert(0, "AAA"); // 头插法
	s2.insert(s2.length(), "CCC");

	cout << s2 << endl;
}

void main27()
{
	string s1 = "AAAbbb";
	//1函数的入口地址 2函数对象 3预定义的函数对象
	transform(s1.begin(), s1.end(),s1.begin(), toupper);
	cout << "s1" << s1 << endl;

	string s2 = "AAAbbb";
	transform(s2.begin(), s2.end(), s2.begin(), tolower);
	cout << "s2:" << s2 << endl;

}


void main2222()
{
	//main21();
	//main22();
	//main23();
	//main24();
	//main25();
	//main26();
	main27();
	cout<<"hello..."<

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C++_enhance-Record15—STL中的字符串类(string)的典型操作)