目录

string笔记

「string」笔记

参考:比特鹏哥

1. string

string是一种类型,指的是字符串,比字符数组更高级

头文件 

#include <string>

int main()
{
  string a;//未初始化
  string b = "good good";//初始化
  string c("good sfternoon");//初始化
  return 0;
}

可以直接把b中的字符串赋给c

eg. b = c;

①没有‘\0’作为结束标志

②每个元素都有下标,与字符数组类似,都从零开始

2. 输入

①cin

不能输入带有空格的字符串

https://i-blog.csdnimg.cn/direct/459db91e8923472488a49f788fa062eb.png

②getline

头文件

两种形式,能输入带有空格的字符串

#include <string>

int main()
{
①getline(cin,字符串名字);
②getline(cin,字符串名字,截至符号);
return 0;
}

①cin:从键盘输入;字符串名字:输入的数据放入到的字符串;到‘\n’停止(不包含‘\n’)

②cin:从键盘输入;字符串名字:输入的数据放入到的字符串;截至符号:可以自定义停止符号(到其停止,不包含‘它’)

https://i-blog.csdnimg.cn/direct/06a2a6af579e4374823b78291971a34e.png

3. 计算string类型字符串长度 size()

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

int main()
{
	string b = "dddd  sss";

	cout << b.size() << endl;
	
	return 0;
}

格式名:数组名 . size()

4. 迭代器(iterator)

类似于指针,是一种对象。访问迭代器指向的值,需要解引用(*)

头文件

begin()与end()

string中的begin()与end()返回迭代器的类型:string :: iterator(用于作为其变量名的类型)

①begin():返回第一个字符所处的位置

②end(): 返回最后一个字符的下一个位置(此位置不属于字符串)

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

int main()
{
	string str = "holle world!";
	//迭代器的使用
	string::iterator it = str.begin();
	string::iterator it1 = str.end();
	cout << *it << endl;//解引用操作
	cout << *(--it1) << endl; 
	
	return 0;
}

这两个迭代器可以加或减某个数,也可相减,所以也可以用这两个迭代器逐个输出字符串

注意,相减只能分别定义再相减,定义一个变量一起减会报错:

	//正确
    string::iterator it1 = str.end();
	string::iterator it2 = str.begin();
	cout << it1-it2 << endl;  
	//错误
	string::iterator it = str.end() - str.begin();
    string::iterator迭代器中没有str.end() - str.begin()这种类型

5. push_back()   末尾添加一个

用于在字符串末尾添加一个字符

头文件

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

int main()
{
  string s;
  s.push_back('a');

  return 0;
}

6. pop_back()     末尾删去一个

删除字符串最后一个字符。如果是空字符还要删去,则会出错。

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

int main()
{
	//一个一个删去 
	string s = "hello word!";
	s.pop_back();
	cout << s << endl;
	s.pop_back();
	cout << s << endl;

    //循环删去 
    string s = "hello word!";
    for(int i = s.size();i>=0;i++)
    {
    	s.pop_back();
    	cout << s << endl;
	}
	
	return 0;
}

7. insert() 中间插入字符或字符串

在字符串中间某位置前插入字符或字符串

头文件 

①变量名.insert(插入位置的下一个位置,插入的字符串);
②变量名.insert(插入位置的下一个位置,插入字符的数量,插入的字符);

https://i-blog.csdnimg.cn/direct/e5f6101e794746778abe6c9e4c7836ec.png

8. +或+=操作

本质:string重载了operator操作符

https://i-blog.csdnimg.cn/direct/94dd823b7bbd4db6a6ed93864c04bbe3.png

9. find() 查询字符/字符串位置

头文件

寻找某一字符或字符串在另一字符串中位置,从所设定的初始位置开始(默认为零,从第一位开始寻找)。找到,返回该字符或字符串第一次出现的起始下标位置;未找到,返回npos(-1)

size_t 变量名 接收find()的返回值

①string类型变量名.find(“字符串”/‘字符’/另一个string类型变量名, (可不写,默认从零开始) 开始查询位置);

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

int main()
{
	string s("good morning evergone! evergone? everyone!");
	//字符
	size_t n = s.find('o');
	cout << "查找o:" << n << endl;
	n = s.find('o',8);
	cout << "查找o第8位之后:" << n << endl;
	//字符串
	// 1 "dfe2wef"
	size_t n1 = s.find("on");
	cout << "查找on:" << n1 << endl;
	n1 = s.find("on",21);
	cout << "查找on第21位之后:" << n1 << endl;
	// 2 string str
	string str = "rgo";
	size_t n2 = s.find(str);
	cout << "查找rgo:" << n2 << endl;
	n2 = s.find(str,20);
	cout << "查找rgo第20位之后:" << n2 << endl;
	return 0;
}

https://i-blog.csdnimg.cn/direct/683034412ba4418ba440e7f0d3315f03.png

②string类型变量名.find(“字符串”,开始查询位置,要查询字符的长度);

https://i-blog.csdnimg.cn/direct/f3d7a51efb854ccca639c83781ad2551.png

验证是否找到:

https://i-blog.csdnimg.cn/direct/909ee5a3700246228df2882e841d066e.png

10. substr() 截取字符

头文件

截取字符串中指定位置指定长度的子串

string类型变量名.sbustr(pos,len);
//pos:默认为0,从第0位开始截取,可设定截取位置
//len:默认npos,一直截取字符串直到末尾,可设定截取长度
#include <iostream>
#include <string>
using namespace std;

int main()
{
	string s = "qwerty uijkolpd sunhsdns.";
	string t;
	cout << "初始t:" << endl; 

	//①s.substr()
	t = s.substr();
	cout << "不加参数:" << t << endl;

	//②s.substr(pos)
	t = s.substr(4);
	cout << "pos:" << t << endl;

	//③s.substr(pos,len)
	t = s.substr(4,6);
	cout << "pos,len:" << t << endl; 

	return 0;
 } 

https://i-blog.csdnimg.cn/direct/3e4b5d0b6ad54a59b5d2cb1b3b51fb82.png

11. 关系运算

‘==’,’!=’,’>’,’<’,’>=’,’<=‘也同样适用于string类型的字符串进行比较,或者比较string类型和C语言风格字符串,但比较的两者中至少要有一个string类型的字符串

比较的不是字符串的长度,而是相对位置字符的ascall码值

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

int main()
{
	string s;
	string t;
	//输入 
	getline(cin,s);
	getline(cin,t);
	//比较 
	if(s>t) cout << "s>t" << endl;
	else if(s == t) cout << "s==t" << endl;
	else cout << "s<t" << endl; 
	return 0;
}

https://i-blog.csdnimg.cn/direct/bf1ceff2443046d08cc3cf42a853e64d.png

12. string类型字符串与数值的转换

①字符串转数值

数值均转成十进制

stoi()/stol()  stod()/stof()

头文件

1.1 实际上是把数值字符转换成数值,从第一个字符开始,遇到不符合要求的字符为止

1.2 stoi() 把字符串转换成int类型

s–string to–转换成 i–int类型;

以此类推,另外三个,l–ling long int类型;  d–double类型;  f–float类型;

1.3 格式

eg. stoi(string类型变量名,㈠接收不符合要求的字符的位置的变量的地址,㈡字符串中数值进制格式);

㈠接收不符合要求的字符的位置的变量的地址

⑴ 要用 size_t 变量名 来接收不符合要求的字符的位置

这个东西实际上就是告诉我们,这串字符到第几位无法转换成数值了

⑵ 也可以不设置,直接写成 NULL0

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

int main()
{
	string s = "01011aa9;9";
	size_t pow;
	int t = stoi(s,&pow);//默认值为十进制 
	cout << "t: " << t << endl;
	cout << "(一)pow:" << pow << endl; 
	
	return 0;
}

㈡字符串中数值进制格式

⑴ 不写,默认为字符串中字符为十进制形式

⑵ 若为2,则认为字符串中字符二进制形式,并且会被转成十进制形式输出,8,16也是如此

https://i-blog.csdnimg.cn/direct/88ffe899883148088b60c1182f422ae5.png

⑶ 若为0,则程序会猜测字符串中字符的进制形式,比如,若为0开头,会被认为是八进制;若            为0x开头,则会被认为是十六进制

https://i-blog.csdnimg.cn/direct/6b5dfc7020164508a17c6c225e64a415.png

②数值转字符串

to_string()就是把数值转换成string类型字符串

整型,浮点型都是可以使用

头文件

https://i-blog.csdnimg.cn/direct/c4ec4e0b9bba44fda95c90f929aa70d5.png

另:

1. isspace() 判断一个字符是否为空白字符

头文件

空白字符:空格和换行符

//统计除空白字符外的字符串个数 
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main()
{
	string s;
	//输入 
	getline(cin,s);
	//统计 
	int t=0;
	for(auto e : s)
	{
		if(isspace(e))//遍历s中是否有字符为空白字符 
		continue;
		else t++;//统计除空白字符外的字符串个数
	 } 
	 //输出 
	 cout << t << endl;
	return 0;
}

2. reverse 字符串的逆序

void reverse(要反转字符串的第一个元素地址(迭代器),要反转字符串的最后一个元素地址(迭代器));

头文件 

https://i-blog.csdnimg.cn/direct/df24eeba52a746ab9e3bb2553b05b6ad.png