c string erase_L2数据结构第05课 字符串string

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

云帆编程老师联系方式:

云帆老师

微信:

fe59701008de90dfd08d90fff5046c93.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值