我试图用另一个词替换句子中的单词。 对于前者如果str1 =“strong”且str2 =“weak”,则str中的第一个字符串应该更改为“如果核心很弱,则不会出错”。 我正在收到分段错误(核心转储)错误。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void func(char *str,char *str1,char *str2,int l1,int l2)
{
int i,m,j,c;
for(i=0;*(str+i)!='\0';i++)
{
if(*(str+i)==*str1)
{
for(m=i,j=0;j<l1;m++,j++) /*checking the equality of the two words*/
{
if(*(str+m)!=*(str1+j))
break;
else
c=1;
}
if(c==1)
{
for(j=i;*(str+j)!='\0';j++)
*(str+j+l2-l1)=*(str+j);
for(m=0,j=i;(*(str2+m)!='\0');j++,m++)
*(str+j)=*(str2+m);
}
}
}
}
int main()
{
char *str[]={
"If the core is strong, you can't go wrong",
"Canada's wonder of the world",
"Processing a sorted array",
"Was that a joke?",
"I wanna be a millionaire",
"Your post is not properly formatted"
};
int i,l1,l2,k,j;
char str1[10],str2[10];
l1=strlen(str1);
l2=strlen(str2);
printf("Enter string 1 : ");
scanf("%s",str1);
printf("\nEnter string 2 : ");
scanf("%s",str2);
for(k=0;k<=5;k++)
func(str[k],str1,str2,l1,l2);
for(i=0;i<6;i++)
{
printf("\n");
for(j=0;*(str[i]+j)!='0';j++)
printf("%c",*(str[i]+j));
}
return 0;
}
答案 0 :(得分:0)
char *str[]={
"If the core is strong, you can't go wrong",
"Canada's wonder of the world",
"Processing a sorted array",
"Was that a joke?",
"I wanna be a millionaire",
"Your post is not properly formatted"
};
这将创建一个字符指针数组,每个指针指向一个字符串文字,如果修改字符串文字,它将导致分段错误,因为它位于只读内存中。这就是你得到分段错误的原因 在代码中也要检查逻辑错误。
答案 1 :(得分:0)
不幸的是,您的代码在许多级别上都是错误的。其他人已经在strlen()
scanf()
之前指出了字符串文字问题以及main()
之前的问题,但有更多错误:
1.您尝试就地编辑字符串。如果用较长的字符串替换子字符串会发生什么?你试图向前移动字符串。但是 意味着你写过分配给字符串的内存的末尾。这是未定义的行为,可能会崩溃。
2.在func()
:
[snip]
if(c==1)
{
for(j=i;*(str+j)!='\0';j++)
*(str+j+l2-l1)=*(str+j);
for(m=0,j=i;(*(str2+m)!='\0');j++,m++)
*(str+j)=*(str2+m);
}
您迭代直到源字符串以空终止,但您不复制空终止符!稍后,您尝试printf()
字符串(逐个字符,由于一些不可思议的原因,也没有检查空终止符,但是对于ASCII '0'
...),然后由于缺少空终止而崩溃。
要解决您的问题,您可以执行以下操作:
1.使用strstr()
遍历字符串以查找要替换的子字符串。计算子串的出现次数
2.使用strlen()
中的func()
来确定子字符串的长度和替换。将差异乘以子字符串的出现次数,以查找新字符串的长度或长度。将差值添加到原始字符串的strlen()
以找出要分配的内存量(请记住为空终止分配额外的字节)。
3.使用malloc()
分配所需的内存
4.使用strcpy()/strncpy()/memmove()/strstr()/whatever standard library functions you need
的组合来组合新字符串。