c语言---字符串:主串中寻找子串,并且删除子串

易错点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 <stdio.h>
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 <iostream>
#include <stdlib.h>
#include <string.h>
#include <math.h>
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;i<strlen(s);i++){
		flag=true;
		for(int j=0;j<strlen(t);j++){
			if(*(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;i<num;i++){
		printf("删除从%d开始的 %s\n",ind[i]-i*n2,s);
		n1=strlen(s);
		int j;	
		for(j=ind[i]-i*n2;j<n1-n2;j++){
			s[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 <iostream>
#include <stdlib.h>
#include <string.h>
#include <math.h>
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(i<strlen(t)){
		if(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(i<strlen(t)){
		if(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;i<strlen(t);i++){
		printf("%c:%d ",t[i],next[i]);
	}
	printf("\n%d ",kmp(s,t,next));
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值