使用自制的 strstr() 函数检查其他字符串中的嵌入字符串,然后将其替换为其他字符串(用户输入)
Using self made strstr() function to check an embedded string in some other string and then replacing it by some other string (input by user)
我正在编写一个程序,该程序使用指向字符串 str[] 的指针数组。它接收两个字符串 str1 和 str2,并检查 str1 是否嵌入到 str[] 中的任何字符串中。如果找到 str1,然后用 str2 替换它。例如:如果 str1 包含 "mountain" 并且 str2 包含 "car",那么 str 中的第二个字符串应该更改为 "Move a car"。当我尝试执行这个程序时,在 gcc 中它崩溃了,当我尝试在线编译它时,它给出了分段错误,我无法理解这个程序哪里出了问题以及需要什么更正。
#include<stdio.h>
#include<string.h>
char* xstrstr(char* ,char* );
int main()
{
char *str[]={
"We will teach you how to...",
"Move a mountain",
"Level a building",
"Erase the past",
"Make a million",
"...all through C!"
};
char* p, *temp, *cpy;
int len,i,j;
char str1[28];
char str2[10];
printf("Enter string1\n");
scanf("%s",str1);
printf("Enter string 2\n");
scanf("%s",str2);
printf("After modifying the saved strings\n\n");
for(i=0;i<6;i++)
{
p=xstrstr(str[i],str1);
if(p)
{
/*Copy the remaining string*/
temp=p+strlen(str1);
strcpy(cpy,temp);
/*Replace the old string*/
strcpy(p,str2);
/*Finally append the remaining part*/
strcat(p,cpy);
break;
}
}
if(p==NULL)
{
printf("No string match found\n");
return 1;
}
for(i=0;i<6;i++)
{
printf("%s\n",str[i]);
}
return 0;
}
char* xstrstr(char *string1,char* string2)
{
while(*string1)
{
char* begin=string1;
char* find=string2;
while((*string1)&&(*find)&&(*string1==*find))
{
string1++;
find++;
}
if(!(*find))
{
return begin;
}
string1=begin+1;
}
return NULL;
}
即您正在使用 strcpy 复制字符串,但您的命运字符串只是一个没有大小的指针。你需要先做一个malloc。这就是为什么它给你一个分段错误。当心没有内存分配的指针,它应该可以工作。请在此之后更新您的代码,如果有任何其他错误,我将编辑此答案
char *cpy;
这些变量从未被初始化。但是你仍然在下面对它进行 strcpy。
编辑:只需使用
cpy = malloc(strlen(sourcestring)+1);
两个主要问题
cpy 未初始化
strcpy(cpy,temp);
p 指向只读字符串字面量,您向其写入。
strcpy(p,str2);
我正在编写一个程序,该程序使用指向字符串 str[] 的指针数组。它接收两个字符串 str1 和 str2,并检查 str1 是否嵌入到 str[] 中的任何字符串中。如果找到 str1,然后用 str2 替换它。例如:如果 str1 包含 "mountain" 并且 str2 包含 "car",那么 str 中的第二个字符串应该更改为 "Move a car"。当我尝试执行这个程序时,在 gcc 中它崩溃了,当我尝试在线编译它时,它给出了分段错误,我无法理解这个程序哪里出了问题以及需要什么更正。
#include<stdio.h>
#include<string.h>
char* xstrstr(char* ,char* );
int main()
{
char *str[]={
"We will teach you how to...",
"Move a mountain",
"Level a building",
"Erase the past",
"Make a million",
"...all through C!"
};
char* p, *temp, *cpy;
int len,i,j;
char str1[28];
char str2[10];
printf("Enter string1\n");
scanf("%s",str1);
printf("Enter string 2\n");
scanf("%s",str2);
printf("After modifying the saved strings\n\n");
for(i=0;i<6;i++)
{
p=xstrstr(str[i],str1);
if(p)
{
/*Copy the remaining string*/
temp=p+strlen(str1);
strcpy(cpy,temp);
/*Replace the old string*/
strcpy(p,str2);
/*Finally append the remaining part*/
strcat(p,cpy);
break;
}
}
if(p==NULL)
{
printf("No string match found\n");
return 1;
}
for(i=0;i<6;i++)
{
printf("%s\n",str[i]);
}
return 0;
}
char* xstrstr(char *string1,char* string2)
{
while(*string1)
{
char* begin=string1;
char* find=string2;
while((*string1)&&(*find)&&(*string1==*find))
{
string1++;
find++;
}
if(!(*find))
{
return begin;
}
string1=begin+1;
}
return NULL;
}
即您正在使用 strcpy 复制字符串,但您的命运字符串只是一个没有大小的指针。你需要先做一个malloc。这就是为什么它给你一个分段错误。当心没有内存分配的指针,它应该可以工作。请在此之后更新您的代码,如果有任何其他错误,我将编辑此答案
char *cpy;
这些变量从未被初始化。但是你仍然在下面对它进行 strcpy。
编辑:只需使用
cpy = malloc(strlen(sourcestring)+1);
两个主要问题 cpy 未初始化
strcpy(cpy,temp);
p 指向只读字符串字面量,您向其写入。
strcpy(p,str2);