通过直接应用string容器的find和erase库函数,进行定位删除操作

1、审题

审题很重要,本人读完几遍题目,没注意题目里面细节,按着我自己想法来写,没有审题,忽略了括号里面的不区分大小写,导致提交后一直答案50,耗费大量时间找错误之处

  1. 题所述给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
  2. 输入只有1组数据。 输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
  3. 删除输入的短字符串(不区分大小写)并去掉空格,输出。

通过读题可以知道,3点:
第一,我们需要对字符串进行删除操作;
第二、需要进行删除操作的字符串要进行循环输入,直到控制窗输入ctrl+Z结束循环(windows);
第三、删除的算法不需要区分里面的大小写,去掉空格

2、流程图

3、部分函数简要介绍

  1. getchar();//这里用于吃掉空格,由于cin直接在缓冲区读取数据,但是遇到空格、tab、换行字符就会停止读取数据,剩下的字符就会暂存在缓冲区,这样就留下了空格以及后面的字符,防止空格在输入缓冲区影响后面的输入,我们这里使用getchar能够把缓冲区空格形象的吃掉
  2. geline(cin,str);//str为字符串,getline函数可以读取整行,包括空格和tab,并将其存储在字符串对象中,遇空格结束输入
  3. s.find(str,pos);//查找字符串str在当前字符串s的额[pos,end]中 **第一次** 出现的位置
  4. //返回值为一个整型数据,若无此字符串返回-1
  5. s.erase(pos,n);//把字符串s从pos位置开始的n个字符删除,返回为一个字符串
  6. //find还有其他的重载,读者需要可以自行查阅

4、代码区

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. //给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
  5. //输入只有1组数据。
  6. //输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
  7. int main()
  8. {
  9. string s, key,s_small,key_small;
  10. //s为要进行删除操作的字符串,key为标记字符串,s_small,key_small分别为其对应小写
  11. cin >> key;
  12. char c=getchar();
  13. //把key字符串全部变成小写
  14. //注意!!!需先对key_small进行定义大小操作!!!否则会报错
  15. key_small.resize(key.size());
  16. for (int i = 0; i < key.size(); i++)
  17. {
  18. if (key[i] > 'A' && key[i] < 'Z')
  19. {
  20. key_small[i] = 32+key[i];
  21. }
  22. else
  23. {
  24. key_small[i] = key[i];
  25. }
  26. }
  27. //标记字符串大小
  28. int sizeofk = key.size();
  29. //删除指定字符(不区分大小写)
  30. while (getline(cin, s))//直到遇到文字结束符结束循环(windous下为ctrl+z)
  31. {
  32. //把s字符串全部变小写
  33. s_small.resize(s.size());
  34. for (int i = 0; i < s.size(); i++)
  35. {
  36. if (s[i] > 'A' && s[i] < 'Z')
  37. {
  38. s_small[i] = 32 + s[i];
  39. }
  40. else
  41. {
  42. s_small[i] = s[i];
  43. }
  44. }
  45. //初始化 标记查找的位置
  46. int fpos = 0;
  47. //通过while循环,一个一个的find到标记字符串位置fpos,一个一个通过fpos进行删除
  48. while (s_small.find(key_small, fpos) != -1)
  49. {
  50. fpos = s_small.find(key_small, fpos);
  51. //删除操作
  52. //同步删除
  53. s = s.erase(fpos, sizeofk);
  54. s_small = s_small.erase(fpos, sizeofk);
  55. }
  56. //若需要区分大小写,则只需要进行如下代码即可(此时:不需要定义key_small,s_small字符串容器)
  57. //while (s.find(key, fpos) != -1)
  58. //{
  59. // fpos = s.find(key, fpos);
  60. // s = s.erase(fpos, sizeofk);
  61. //}
  62. //只输出不含空格字符
  63. for (int i = 0; i < s.size(); i++)
  64. {
  65. if (s[i] != ' ')
  66. {
  67. cout << s[i];
  68. }
  69. }
  70. cout << endl;
  71. }
  72. system("pause");
  73. return 0;
  74. }
点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论