[英]Replacing a substring in a string with another substring in c using array of pointers to string
我试图用另一个子字符串替换字符串中的子字符串。 但是,我在strcpy(p,str2)行遇到了分段错误。 我不理解为什么。 这是我的代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
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 str1[20], str2[20];
printf("Enter first string\n");
scanf("%s", str1);
printf("Enter second string\n");
scanf("%s", str2);
char *news, *t, *p;
int i;
if(strlen(str2) > strlen(str1))
{
printf("Second string should be smaller than first string\n");
exit(1);
}
for(i = 0; i < 6; i++)
{
p = strstr(str[i], str1);
if(p)
{
news = p + strlen(str1);
strcpy(t,news);
strcpy(p, s);
strcat(p,t);
break;
}
}
printf("the new string is\n");
for( i = 0; i < 6; i++)
{
printf("%s\n", str[i]);
}
return 0;
}
您将复制到字符串t
,但从未将其初始化为指向任何地方。
strcpy(t, news);
这是个坏消息-哦,不,这是不好的t
的喜讯。
您也有第二个问题。 您正在尝试修改指针的str
数组中的字符串,但这是字符串文字。 您不能可靠地修改字符串文字。 您必须进行修改,以免您这样做。
p = strstr(str[i], str1); // Generates a pointer into str[i]
...
strcpy(p, s); // Modifies str[i] -- unsuccessfully
为此,最简单(但不一定最好)的解决方法是使用:
char str[][64] = {"We will teach you how to",
"Move a mountain",
"Level a building",
"Erase the past",
"Make a million",
"...all through C"
};
我没有花很长时间来思考数组第二维的正确大小,但是64看起来可能为您留出了足够的空间来稍微增加字符串。 也许没关系,因为关于第二个字符串的注释必须比第一个短,因此您只需要处理缩小的字符串。 幸运的是您能够做到这一点。 如果您的琴弦可能长大,则必须小心避免麻烦。
正如t0mm13b在评论中首先指出的那样 ,代码中没有变量s
。 请确保您发布了可编译的代码。
进一步看一下内部循环,我们可以看到各种问题:
news = p + strlen(str1);
赋值意味着在str[i]
找到str1
之后, news
指向了str[i]
尾部。 news
不确定的信息量复制到未初始化的指针t
指向的空间中。 这是核心转储的第一个来源。 s
复制到p
。 那是不是str2
,因为在长度检查之后不使用str2
? 这是核心转储的第二个来源。 s
复制材料之后,您可以从t
复制材料。 如果您还没有转储核心,那么这可能是核心转储的第三个来源(尽管如果您尚未转储核心,这也不会触发任何一个)。 您可能需要:
char *p = strstr(str[i], str1);
if (p != 0)
{
char t[64];
strcpy(t, p + strlen(str1));
strcpy(p, str2);
strcat(p, t);
}
这远不能证明没有溢出,但是更接近声音。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.