输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
提示:输入数据的设计使得不可能出现输出为空的情况。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
* 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,
* 即结果字符串中不能包含S2。
* 提示:输入数据的设计使得不可能出现输出为空的情况。
*/
char* str_remove_key(const char* src,const char* key);
int main(void)
{char *src = "ccaabbccddcckkccmmccppccqqccxx";//char *src = "xxww";char* p =str_remove_key(src,"cc");printf("%s\n",p);free(p);return 0;
}char* str_remove_key(const char* src,const char* key)
{int keyLen = strlen(key);// cc aabb ccddcckkccmmccppccqqccxxchar *xx = (char*)malloc(strlen(src)+1);char *dest = (char*)malloc(strlen(src)+1);char *xtemp = xx;int lastIndex = 0;int i=0;while((xx = strstr(src,key))!=NULL){int len = xx - src;if(len){for(i=0;i<len;i++){dest[lastIndex+i] = *(src+i);}lastIndex += i;// printf("lastIndex = %d\n",lastIndex);// dest[lastIndex] = '\0';}else{// do nothing !}// printf("src = %s , dest = %s\n",src,dest);xx +=keyLen;src = xx;}dest[lastIndex] = '\0';strcat(dest,src);// printf("-------------- src = %s , dest = %s\n",src,dest);free(xtemp);return dest;
}

整体思路如下:

  • strstr()函数来不断查找子串的位置;然后保存子串前面的字符集;然后让子串丢弃前面的关键子串。并改变src为返回的子串;不断查找,直到src中没有子串了为止。

strstr(“abcd”,”ab”) –> “abcd”
strstr(“abcd”,”bc”) –> “bcd”
上面这两个栗子足以说明,为什么要让strstr()得到的返回值去丢弃前面的关键子串了。

步骤如下:

  1. 首先定义返回值char* dest,因为不知道会是多大,但是最大就是和src大小相同。于是char *dest = (char*)malloc(strlen(src)+1);

  2. 定义查找返回的子串char *xx。因为也不知道多大,但最大也就和src相同。于是char *xx = (char*)malloc(strlen(src)+1);。同时定义一个临时指针xtemp,指向当前的定义的xx(为了后续的free(xtemp))。

  3. 最关键的一步:定义dest的当前需要移动到哪。这里使用了两个变量来共同定义的。分别是lastIndexi

    • 这里为什么要定义两个变量呢?不显得多余吗?
    • 答: 注意:这里的i是要给后续的前字符串用的。因为前字符串是一个一个字符放入到dest中的。i是每次查找之后,被strstr函数丢弃的子串需要的索引。而lastIndex呢,是要记录dest现在的可用空间索引。所以,每次增加一个字符到dest,实际上是应该存放到lastIndex + i所指的位置的空间里面的。
  4. 然后就是循环查找关键子串是否存在于src中,使用的就是库函数strstr(src,key)。该函数的特点是,找到了,就返回当前key的位置(指针)。找不到就返回NULL
    • 循环给xx赋值,只要xx不为NULL就获取被丢弃的长度int len = xx-src。判断 len,如果len>0,说明前面有被丢弃的字符串。那么,就通过一个for循环取src所指的内容*(src+i)并存放到dest对应的位置*dest[lastIndex+i]for结束,就给lastIndex再次赋值:lastIndex = i;因为这时候的i的位置刚好是下次dest应该存放内容的位置。比如:dest现在是“abcd”,那么,这时候就该把lastIndex设置为4。因为下次就应该存放新的内容到(dest+4)的位置上。
    • 这时候,里面的事情并没有结束。这时候,也有一件重要的事情,就是移动指针xxstrlen(key)的后面。也就是丢弃本次查询到的关键子串。也就要xx += strlen(key);,然后src = xx;。这一步是改变循环状态。否则就会死循环,并且不能顺利获取下次查询丢弃的内容了。
    • 在循环结束之后,(即使是从来没有进入过循环)。给dest[lastIndex]赋值为\0。并执行strcat(dest,src)的操作。
      • 为什么要执行这一步呢?
      • 因为,如果没有查询到,那么返回值应该和src相同;如果查询到了,但是,末尾的字符比如是zz,不是关键子串key(假设关键子串为cc),那么也应该包括末尾的zz
  5. 到这里,就得到去除关键子串之后的字符串了。但是记得free(xtemp);,最后return dest;返回结果。

OK,看看输出吧:

char *key = "cc";
// 如果char *src = "ccaabbccddcckkccmmccppccqqccxx";
输出如下:aabbddkkmmppqqxx
// 如果char *src = "xxww";
输出如下:xxww

C 超级难搞定的 删除字符串中的子串相关推荐

  1. 7-121 删除字符串中的子串 (20 分)

    7-121 删除字符串中的子串 (20 分) 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以 ...

  2. 7-29 删除字符串中的子串

    PTA-7-29 删除字符串中的子串 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结束 ...

  3. 7-8 删除字符串中的子串(20 分)

    7-8 删除字符串中的子串(20 分) 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结 ...

  4. 7-1 删除字符串中的子串 (20分)

    7-1 删除字符串中的子串 (20分) 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结 ...

  5. 7-8 删除字符串中的子串 (10 分)

    7-8 删除字符串中的子串 (10 分)输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结 ...

  6. PAT 10-2 删除字符串中的子串

    今天发一个不完全对(通过garbageMan园友的帮忙,现已全对)的代码,(/*后两用例未通过,一时看不出问题在哪,*/)切入正题 /*Name: Copyright: Author: Date: 0 ...

  7. c语言在单行文本上删除子串,一道比较简单的题——PTA基础编程题目集 7-29 删除字符串中的子串 C语言试解-Go语言中文社区...

    首先看题目 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结束的2个非空字符串,对应S1 ...

  8. js删除字符串中的子串

    const removeString = (string, separator) => {//我们分割字符串并使其不带分隔符const separatedArray = string.split ...

  9. c语言:删除字符串中的子串

    代码实现: #include<stdio.h> #include <string.h> int main() {char a[50] = { '\0' };char b[50] ...

最新文章

  1. Google 的服务,你用了那些?
  2. java 把文件打包成zip_java 文件流的处理 文件打包成zip
  3. python接口自动化(四十二)- 项目架构设计之大结局(超详解)
  4. JavaScript数据结构——树(Tree)
  5. php 控制台打印_php调试利器:FirePHP的安装与使用
  6. webpack(三)使用 babel-loader 转换 ES6代码
  7. Java开发环境安裝教程
  8. 计算机ppt实训报告总结,计算机实训总结模板
  9. 2019 ICPC 上海站网络赛 K.Peekaboo (圆上整点)
  10. 用xpath解析网页
  11. MySQL的下载与安装详细教程
  12. [转]技术经纪人将成职业新宠
  13. 哥伦比亚大学公众人物脸部数据集
  14. Groups CodeForces - 1598B
  15. python 画三角函数_Python计算三角函数之asin()方法的使用
  16. 深度学习之父Geoffrey Hinton:我的五十年深度学习生涯与研究心得
  17. 在线广告原理:从橱窗到互联网广告核心交易模式——RTB
  18. LaTeX 制作(跨页)长表格
  19. $NOIP2016$天天爱跑步
  20. fwPlayer 支持最新浏览器在线播放AVI和FLV格式的视频

热门文章

  1. python 爬虫餐饮行业 数据分析_Python爬取美团美食板块商家数据
  2. 每日一Lua(2)-语句
  3. WMI(windows management instrumentation)利用思路简介
  4. pandas读取excel-xlrd相关
  5. Timer与TimerTask的真正原理使用介绍
  6. 前端显示微信消息中的emoji表情
  7. 世界八大男士衬衫品牌
  8. Matlab数字(所有数值存储为双精度浮点数)
  9. 会计学原理 读书笔记
  10. Linux下文件的操作