C 超级难搞定的 删除字符串中的子串
输入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()得到的返回值去丢弃前面的关键子串了。
步骤如下:
首先定义返回值
char* dest
,因为不知道会是多大,但是最大就是和src
大小相同。于是char *dest = (char*)malloc(strlen(src)+1);
定义查找返回的子串
char *xx
。因为也不知道多大,但最大也就和src
相同。于是char *xx = (char*)malloc(strlen(src)+1);
。同时定义一个临时指针xtemp
,指向当前的定义的xx
(为了后续的free(xtemp)
)。最关键的一步:定义
dest
的当前需要移动到哪。这里使用了两个变量来共同定义的。分别是lastIndex
与i
。- 这里为什么要定义两个变量呢?不显得多余吗?
- 答: 注意:这里的
i
是要给后续的前字符串用的。因为前字符串是一个一个字符放入到dest
中的。i
是每次查找之后,被strstr
函数丢弃的子串需要的索引。而lastIndex
呢,是要记录dest
现在的可用空间索引。所以,每次增加一个字符到dest
,实际上是应该存放到lastIndex + i
所指的位置的空间里面的。
- 然后就是循环查找关键子串是否存在于
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)
的位置上。 - 这时候,里面的事情并没有结束。这时候,也有一件重要的事情,就是移动指针
xx
到strlen(key)
的后面。也就是丢弃本次查询到的关键子串。也就要xx += strlen(key);
,然后src = xx;
。这一步是改变循环状态。否则就会死循环,并且不能顺利获取下次查询丢弃的内容了。 - 在循环结束之后,(即使是从来没有进入过循环)。给
dest[lastIndex]
赋值为\0
。并执行strcat(dest,src)
的操作。- 为什么要执行这一步呢?
- 因为,如果没有查询到,那么返回值应该和
src
相同;如果查询到了,但是,末尾的字符比如是zz
,不是关键子串key(假设关键子串为cc
),那么也应该包括末尾的zz
。
- 循环给
- 到这里,就得到去除关键子串之后的字符串了。但是记得
free(xtemp);
,最后return dest;
返回结果。
OK,看看输出吧:
char *key = "cc";
// 如果char *src = "ccaabbccddcckkccmmccppccqqccxx";
输出如下:aabbddkkmmppqqxx
// 如果char *src = "xxww";
输出如下:xxww
C 超级难搞定的 删除字符串中的子串相关推荐
- 7-121 删除字符串中的子串 (20 分)
7-121 删除字符串中的子串 (20 分) 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以 ...
- 7-29 删除字符串中的子串
PTA-7-29 删除字符串中的子串 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结束 ...
- 7-8 删除字符串中的子串(20 分)
7-8 删除字符串中的子串(20 分) 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结 ...
- 7-1 删除字符串中的子串 (20分)
7-1 删除字符串中的子串 (20分) 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结 ...
- 7-8 删除字符串中的子串 (10 分)
7-8 删除字符串中的子串 (10 分)输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结 ...
- PAT 10-2 删除字符串中的子串
今天发一个不完全对(通过garbageMan园友的帮忙,现已全对)的代码,(/*后两用例未通过,一时看不出问题在哪,*/)切入正题 /*Name: Copyright: Author: Date: 0 ...
- c语言在单行文本上删除子串,一道比较简单的题——PTA基础编程题目集 7-29 删除字符串中的子串 C语言试解-Go语言中文社区...
首先看题目 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结束的2个非空字符串,对应S1 ...
- js删除字符串中的子串
const removeString = (string, separator) => {//我们分割字符串并使其不带分隔符const separatedArray = string.split ...
- c语言:删除字符串中的子串
代码实现: #include<stdio.h> #include <string.h> int main() {char a[50] = { '\0' };char b[50] ...
最新文章
- Google 的服务,你用了那些?
- java 把文件打包成zip_java 文件流的处理 文件打包成zip
- python接口自动化(四十二)- 项目架构设计之大结局(超详解)
- JavaScript数据结构——树(Tree)
- php 控制台打印_php调试利器:FirePHP的安装与使用
- webpack(三)使用 babel-loader 转换 ES6代码
- Java开发环境安裝教程
- 计算机ppt实训报告总结,计算机实训总结模板
- 2019 ICPC 上海站网络赛 K.Peekaboo (圆上整点)
- 用xpath解析网页
- MySQL的下载与安装详细教程
- [转]技术经纪人将成职业新宠
- 哥伦比亚大学公众人物脸部数据集
- Groups CodeForces - 1598B
- python 画三角函数_Python计算三角函数之asin()方法的使用
- 深度学习之父Geoffrey Hinton:我的五十年深度学习生涯与研究心得
- 在线广告原理:从橱窗到互联网广告核心交易模式——RTB
- LaTeX 制作(跨页)长表格
- $NOIP2016$天天爱跑步
- fwPlayer 支持最新浏览器在线播放AVI和FLV格式的视频