易错点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);
}
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));
}
下一篇:Conda环境导出与导入