c语言---字符串:主串中寻找子串,并且删除子串
创始人
2025-05-30 02:50:00
0

易错点1:
在这里插入图片描述

原文链接:https://blog.csdn.net/qq_31347869/article/details/105877116

易错点2:
在这里插入图片描述

直接返回str数组名(注意不需要加&)。但事实上,运行结果并不正确,因为str本身是一个自定义函数中的局部变量,是一个数组有5个字节,它的生命周期当然也随着它所在的函数在一起,随着fun函数调用的结束,其中的各种局部变量也将被系统收回,所以str数组这5个字节也将被回收,自然在main函数里再输出肯定已经不是原来的内容了。

原文链接:https://blog.csdn.net/happy_playwd/article/details/120917202

易错点3:

char s1[]="ABC";
printf("%c",tolower(s1[0])); 
答案:打印a
#include 
int main()
{printf("tolower('-')=%c\n",tolower('-'));printf("tolower('0')=%c\n",tolower('0'));printf("tolower('a')=%c\n",tolower('a'));printf("tolower('A')=%c\n",tolower('A'));
}

原文链接:https://blog.csdn.net/wucz122140729/article/details/105710187

字符串:主串中寻找子串,并且删除子串

在主串中寻找子串,并且删除子串
(暴力求解)

#include 
#include 
#include 
#include 
using namespace std;
#define MAXSIZE 100
//寻找t子串在s主串出现的位置,并将出现的位置记录在数组ind中,函数返回出现子串的次数num
int index(char *s,char *t,int ind[]){bool flag;int num=0;printf("子串在主串中出现的位置是");for(int i=0;iflag=true;for(int j=0;jif(*(s+i+j)!=*(t+j)){flag=false;}}if(flag==true){ind[num]=i;num++;printf("%d ",i);}}printf("\n");return num;
}
//在主串s中删除子串t,每次子串出现的位置在Ind数组中,子串t总共在主串s中出现了num次
void cut(char s[],char t[],int ind[],int num){int n1;int n2=strlen(t);for(int i=0;iprintf("删除从%d开始的 %s\n",ind[i]-i*n2,s);n1=strlen(s);int j;	for(j=ind[i]-i*n2;js[j]=s[j+3];}s[j]='\0';printf("本轮删除后结果为%s\n",s);}
}
int main(){int ind[MAXSIZE];bool flag;int num=0;char s[]="abcdaaabcdaaaabcda";char t[]="bcd";num=index(s,t,ind);printf("\n主字符串总共有 num:%d 个子字符串\n",num);cut(s,t,ind,num);
}

王道版—kmp模式匹配算法

next数组的求法:

我们能确定next数组第一二位一定分别为0,1,后面求解每一位的next值时,根据前一位进行比较。
从第三位开始,将前一位与其next值对应的内容进行比较, 如果相等,则该位的next值就是前一位的next值加上1;
如果不等,向前继续寻找next值对应的内容来与前一位进行比较, 直到找到某个位上内容的next值对应的内容与前一位相等为止,
则这个位对应的值加上1即为需求的next值; 如果找到第一位都没有找到与前一位相等的内容,那么求解的位上的next值为1。

注意下标都是从1开始的
传送门:https://blog.csdn.net/m0_37482190/article/details/86667059
原文链接:https://blog.csdn.net/qq_44867340/article/details/119455799


#include 
#include 
#include 
#include 
using namespace std;
#define MAXSIZE 100
//简单的模式匹配(暴力匹配)
int index(char s[],char t[]){int i=1,j=1;while(i<=strlen(s)&&j<=strlen(t)){if(s[i]==t[j]){ ++i;++j;}else{ i=i-j+2;j=1;}}if(j>strlen(t)) return i-strlen(t);else return 0;
} 
//改进模式匹配算法---kmp
//next
void get_next(char t[],int next[]){int i=1,j=0;next[1]=0;while(iif(j==0||t[i]==t[j]){ ++i;++j;next[i]=j;}else{ j=next[j];}}
} 
//进一步优化kmp
void get_nextval(char t[],int next[]){int i=1,j=0;next[1]=0;while(iif(j==0||t[i]==t[j]){++i;++j;if(t[i]==t[j]) next[i]=next[j];else next[i]=j;}else{j=next[j];}}
}
//kmp
int kmp(char s[],char t[],int next[]){int i=1,j=1;while(i<=strlen(s)&&j<=strlen(t)){if(j==0||s[i]==t[j]){ ++i;++j;}else{j=next[j];}}if(j>strlen(t)){return i-strlen(t);}else return 0;
}
int main(){char s[]=" abaaaab";char t[]=" aaaab";int next[MAXSIZE];get_next(t,next);//get_nextval(t,next);for(int i=1;iprintf("%c:%d ",t[i],next[i]);}printf("\n%d ",kmp(s,t,next));
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...