删除指定字符串中的子串
2015-08-02 16:02
281 查看
问题描述
在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。要求实现函数:
int delete_sub_str(const char *str, const char *sub_str, int sub_str_num,char *result)
【输入】 str:输入的被操作字符串
sub_str:需要查找并删除的特定子字符串
sub_str_num:子字符串的长度
result:所要求的结果
【返回】 删除的子字符串的个数
示例
输入:str = "a1234bc123de12abc123d1234"sub_str = "1234"
输出:result = "abc123de12abc123d"
返回:2
关键点:
在示例中,当主字符串循环到de12的时候,由于和字符串只是12两个字符相同,第3个字符不同,那么这个时候,只能把子字符串中的前两个字符拷贝到目标串中。代码
#include <stdlib.h> #include <stdio.h> #include <string.h> int delete_sub_str(const char *str,const char *sub_str,int sub_str_len,char *result) { int num=0,k=0;//num记录重复的子串个数,k用来记录result当前的位置 int i=0,j=0;//i和j分别为str和sub_str指针 const char *p_sub_str=sub_str;//p_sub_str用来还原sub_str到起始位置 while(str[i]!='\0'){ if(str[i]!=sub_str[j]){ result[k++]=str[i++]; }else{ const char *temp=sub_str; //此处的循环必须满足两个条件 for(;(str[i]==sub_str[j])&&sub_str[j]!='\0';j++){ i++; } if(j==sub_str_len){ num++;//出现重复子串,num加1 } else{ //此处是关键 //比如说字符串为1234;主字符串如果和子字符串前两个字符相同,但第三个字符不同 //那么此时应该退出循环,并且把子字符串的前两个字符拷贝到result中去 for(int m=0;m<j;m++){ result[k++]=temp[m]; } } //重新让子字符串回到起始位置 sub_str=p_sub_str; j=0; } } return num; } int main() { char *a="a1234bc123de12abc123d1234"; char *b="1234"; char c[100]={0}; int sub_str_len=strlen(b); int i=delete_sub_str(a,b,sub_str_len,c); printf("Total deleted sub_str is %d\n",i); printf("%s\n",c); return 0; }
其他变形
题目一:写一个字符串替换函数,如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace),strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。相关文章推荐
- 关于微信分享、登录的一些注意事项
- 黑马程序员------泛型
- 函数的缺省参数和函数初始化示例以及布尔型参数的使用示例
- JXPath(1.3) - DOM/JDOM Document Access
- ECLIPSE使用appcompat_v7库无法找到android:Widget.Material.ActionButton的问题
- 在Android项目中新建及添加Library
- OSG 视景器、漫游器、摄像机与场景的关系
- hdu 2588 GCD---欧拉函数
- 我看保护模式
- http://blog.csdn.net/uranus_wm/article/details/9838847
- 黑马Java EE面试总结
- 107.Binary Tree Level Order Traversal II
- ps绘制漂亮的晶莹剔透云朵方法
- hdu 5317
- POJ-1316
- AngularJs学习笔记__1、初步了解AngularJS
- [深入理解Android卷一全文-第六章]深入理解Binder
- Remove Element
- urllib2模块
- 简单md5加密