原文链接:https://blog.csdn.net/qq_31347869/article/details/105877116
直接返回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;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;i++){
printf("删除从%d开始的 %s\n",ind[i]-i*n2,s);
n1=strlen(s);
int j;
for(j=ind[i]-i*n2;j;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);
}
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(i{
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{
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));
}