繁体   English   中英

使用指向字符串的指针数组将字符串中的子字符串替换为c中的另一个子字符串

[英]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 请确保您发布了可编译的代码。

进一步看一下内部循环,我们可以看到各种问题:

  1. news = p + strlen(str1); 赋值意味着在str[i]找到str1之后, news指向了str[i]尾部。
  2. 您将news不确定的信息量复制到未初始化的指针t指向的空间中。 这是核心转储的第一个来源。
  3. 您将未定义的变量s复制到p 那是不是str2 ,因为在长度检查之后不使用str2 这是核心转储的第二个来源。
  4. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM