L2-数据结构-第05课 字符串string
string
string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作
底层:是一种顺序表的结构,元素是char类型的字符
头文件
#include
定义
string str1;
str1 = "hello";
string str2(str1);
string str3("world")string str4(4, 'a'); // str4="aaaa";
输入
cin >> str1;
getline(cin, str1); // 一行
长度
str1.length();
str1.size();
访问
string 对象的下标从 0 开始。如果 s 是一个 string 对象且 s 不空,则 s[0] 就是字符串的第一个字符, s[1] 就表示第二个字符,而 s[s.size() - 1] 则表示 s 的最后一个字符。
for(int i = 0; i cout <
运算
//连接
str1 = str1+str2;
str1 += str2;
str1.append(str2);
// 比较 >=
// 以下返回值:
// 小于 0 表示当前的字符串小;
// 等于 0 表示两个字符串相等;
// 大于 0 表示另一个字符串小。
str1 > str2;
str1 == str2;
assign函数 (了解)
str.assign("ABC")——清空字符串,并设置为 "ABC"
str.assign("ABC",2)——清空字符串,并设置为"AB",保留两个字符
str.assign("ABC",1,1)——清空字符串,设置为 "ABC" 中的从 位置1 开始,保留 1个 字符
str.assign(5,'A')——清空字符串,然后字符串设置为 5个 'A'
insert
str.insert(2, 3, 'A')——在str下标为2的位置添加 3个 字符'A'
str.insert(2, "ABC")——在str下标为2的位置添加 字符串 "ABC"
str.insert(2, "ABC", 1)——在str下标为2的位置添加 字符串 "ABC" 中 1个 字符
str.insert(2, "ABC", 1, 1)——在str下标为2的位置添加 字符串 "ABC" 中从位置 1 开始的 1 个字符
erase(下标), clear() 和 empty()
str.erase(2)——删除 下标2 的位置开始,之后的全删除
str.erase(2,1)——删除 下标2 的位置开始,之后的 1个 删除
str.clear()——删除 str 所有
str.replace(2,4,"abcd")——从 下标2 的位置,替换 4个字节 ,为"abcd"
str.empty()——判空
反转 reverse()
// 位于头文件
reverse(str.begin(),str.end())——str的开始 到 结束字符反转
find(str, 下标)
find函数:从头查找 查找成功返回位置 ,查找失败,返回-1
str.find('A')——查找 'A'
str.find("ABC")——查找 "ABC"
int n=s4.find("ABC"); s4:ABCD -> n = 0
str.find('B', 1)——从 位置1 处,查找'B'
str.find("ABC", 1, 2)——从 位置1 处,开始查找 'ABC' 的前 2个 字符
rfind函数:从尾部查找
str.rfind('A')——查找 'A'
str.rfind("ABC")——查找 "ABC"
int n=s4.rfind("ABC"); s4:AAAABCD -> n = 3
str.rfind('B',1)——从 位置1 处,向前查找'B'
str.rfind("ABC",1,2)——从 位置1 处,开始向前查找 'ABC' 的前 2个 字符
find_first_of()函数:
查找是否包含有子串中任何一个字符
str.find_first_of("abBc")——查找 "abBc" 和str 相等的任何字符,"abBc" 中有就返回位置
str.find_first_of("abBc",1)——查找 "abBc" 和str 相等的任何字符,从 位置1 处,开始查找"abBc" 中的字符,"abBc" 中有的就返回位置
str.find_first_of("abBc",1,2)——查找 "abBc" 和str 相等的任何字符,从 位置1 处,开始查找"abBc" 的前 2 个 字符,"abBc" 中有的就返回位置
find_last_of()函数:
find_last_of ()末尾查找, 从末尾处开始,向前查找是否包含有子串中任何一个字符
str.find_last_of("abBc")——查找 "abBc" 和str 相等的任何字符,向前查找,"abBc" 中有的返回位置
str.find_last_of("abBc",1)——查找 "abBc" 和str 相等的任何字符,从 位置1 处,开始向前查找"abBc" 中的字符,"abBc" 中有的就返回位置
str.find_last_of("abBc",10,2)——查找 "abBc" 和str 相等的任何字符,从 位置10 处,开始向前查找"abBc" 的前 2个 字符,"abBc" 中有的就返回位置
#include
#include
using namespace std;
int main(){
string s1("Source Code");
int n;
if ((n = s1.find('u')) != string::npos) //查找 u 出现的位置
cout <"1) " <"," <endl;
//输出 l)2,urce Code
if ((n = s1.find("Source", 3)) == string::npos)
//从下标3开始查找"Source",找不到
cout <"2) " <"Not Found" <endl; //输出 2) Not Found
if ((n = s1.find("Co")) != string::npos)
//查找子串"Co"。能找到,返回"Co"的位置
cout <"3) " <", " <endl;
//输出 3) 7, Code
if ((n = s1.find_first_of("ceo")) != string::npos)
//查找第一次出现或 'c'、'e'或'o'的位置
cout <"4) " <", " <endl;
//输出 4) l, ource Code
if ((n = s1.find_last_of('e')) != string::npos)
//查找最后一个 'e' 的位置
cout <"5) " <", " <endl;
//输出 5) 10, e
if ((n = s1.find_first_not_of("eou", 1)) != string::npos)
//从下标1开始查找第一次出现非 'e'、'o' 或 'u' 字符的位置
cout <"6) " <", " <endl;
//输出 6) 3, rce Code
return 0;
}
substr()
str1=str.substr(2)——提取子串,提取出 str 的 下标为2 到末尾,给 str1
str1=str.substr(2,3)——提取子串,提取出 str 的 下标为2 开始,提取三个字节,给 str1
compare()
compare函数:完全相等返回0;完全不等返回小于0;部分相等返回大于0 示例对象:
string str(“abcd”);
str.compare(“abcd”)——完全相等,返回0
str.compare(“dcba”)——返回一个小于0的值
str.compare(“ab”)——返回大于0的值
str.compare(str)——相等
str.compare(0,2,str,2,2)——用str的 下标0 开始的 2个字符 和 str的 下标2 开始的 2个 字符比较——就是用 "ab" 和 "cd”" 比较,结果小于零
str.compare(1,2,”bcx”,2)——用str的 下标1 开始的 2个字符 和 "bcx"的 前 2个 字符比较——就是用 "bc" 和 "bc”" 比较,结果是零
转成字符数组
printf("%s", str1.c_str());
字符串和数值互转
字符串到数字的转换可以通过 stoX() 系列函数来执行。该系列函数的成员可以将字符串转换为 int、long、float 和 double 类型的数字.
int stoi(const strings str, size_t* pos = 0, int base = 10)long stol(const strings str, size_t* pos = 0, int base = 10)float stof(const strings str, size_t* pos = 0)double stod(const strings str, size_t* pos = 0)string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
例题 1 文字处理软件
P5734 【深基6.例6】文字处理软件
题目描述
你需要开发一款文字处理软件。最开始时输入一个字符串(不超过 100 个字符)作为初始文档。可以认为文档开头是第 0 个字符。需要支持以下操作:
1 str:后接插入,在文档后面插入字符串 str,并输出文档的字符串。
2 a b:截取文档部分,只保留文档中从第 a 个字符起 b 个字符,并输出文档的字符串。
3 a str:插入片段,在文档中第 a 个字符前面插入字符串 str,并输出文档的字符串。
4 str:查找子串,查找字符串 str 在文档中最先的位置并输出;如果找不到输出 -1。
为了简化问题,规定初始的文档和每次操作中的 str 都不含有空格或换行。最多会有 q(q≤100) 次操作。
输入格式
无
输出格式
无
输入输出样例
- 输入 #1复制
4
ILove
1 Luogu
2 5 5
3 3 guGugu
4 gu
- 输出 #1复制
ILoveLuogu
Luogu
LuoguGugugu
3
分析
插入, 截取, 查找等字符串, 如果使用string 会比较简单.
参考代码
#include
#include
using namespace std;
string s, s2;
int n, opt, a, b;
int main(){
cin >> n;
cin >> s;
for(int i = 1; i <= n; i++) {
cin >> opt;
switch(opt) {
case 1:
cin >> s2;
s = s + s2;
cout <endl;
break;
case 2:
cin >> a >> b;
s = s.substr(a, b);
cout <endl;
break;
case 3:
cin >> a >> s2;
s.insert(a, s2);
cout <endl;
break;
case 4:
cin >> s2;
int p = s.find(s2);
cout <endl;
break;
}
}
return 0;
}
stringstream
定义了三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作。
主要用来进行数据类型转换,由于使用 string 对象来代替字符数组(snprintf方式),就避免缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符的问题。简单说,相比c库的数据类型转换而言,更加安全、自动和直接。
- string 到 int 的转换
string str = "1234";
int n=0;
stringstream ss;
ss <ss >> n;//n等于1234
- clear()
如果要在多次转换中使用同一个stringstream对象,记住在每次转换前要使用clear()方法
ss.clear();
例题 2 口算练习题
P1957 口算练习题
题目描述
王老师正在教简单算术运算。细心的王老师收集了i道学生经常做错的口算题,并且想整理编写成一份练习。编排这些题目是一件繁琐的事情,为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量,比如5+8的算式最好只要输入5和8,输出的结果要尽量详细以方便后期排版的使用,比如对于上述输入进行处理后输出 5+8=13 以及该算式的总长度6。王老师把这个光荣的任务交给你,请你帮他编程实现以上功能。
输入格式
第一行为数值i
接着的i行为需要输入的算式,每行可能有三个数据或两个数据。
若该行为三个数据则第一个数据表示运算类型,a表示加法运算,b表示减法运算,c表示乘法运算,接着的两个数据表示参加运算的运算数。
若该行为两个数据,则表示本题的运算类型与上一题的运算类型相同,而这两个数据为运算数。
输出格式
输出2*i行。对于每个输入的算式,输出完整的运算式及结果,第二行输出该运算式的总长度
输入输出样例
- 输入 #1复制
4
a 64 46
275 125
c 11 99
b 46 64
- 输出 #1复制
64+46=110
9
275+125=400
11
11*99=1089
10
46-64=-18
9
说明/提示
数据规模与约定
0
运算数为非负整数且小于10000
对于50%的数据,输入的算式都有三个数据,第一个算式一定有三个数据。
分析
使用stringstream 来解析出两个int, 并且保存到string 进行输出.
参考代码
#include
#include
#include
#include
#include
#include
using namespace std;
string s;
stringstream ss;
int n, flag, a, b;
int main(){
cin >> n;
getline(cin, s);
for(int i = 1; i <= n; i++) {
getline(cin, s);
ss.clear();
if(s[0] == 'a') {
flag = 0;
ss <1);
} else if(s[0] == 'b') {
flag = 1;
ss <1);
} else if(s[0] == 'c') {
flag = 2;
ss <1);
} else {
ss < }
ss >> a >> b;
if(flag == 0) {
ss.clear();
ss <"+" <"=" < ss >> s;
cout <endl <endl;
} else if(flag == 1) {
ss.clear();
ss <"-" <"=" < ss >> s;
cout <endl <endl;
}
if(flag == 2) {
ss.clear();
ss <"*" <"=" < ss >> s;
cout <endl <endl;
}
}
return 0;
}
作业
- P1957 口算练习题
- P5734 【深基6.例6】文字处理软件
- P1765 手机
- P3741 honoka的键盘
- P1321 单词覆盖还原
- P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
云帆编程老师联系方式:
云帆老师
微信: