查找子字符串并在C中替换它

时间:2017-12-24 05:37:34

标签: c string

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {     

char * str = "Testing replace text...\n\n";


        char* buffer = malloc(sizeof(char));
        char* insertPoint = &buffer[0];
        char* copy = str; 
        char* p = strstr(str, "epl");
        char* g = "gard";
        int size = 0; 

        size = p-copy; //p = 9, which is the number of elemts till the first element of the substring
                       //want to allocate this space, and then increment insertPoint, by that amt(it'll be pointing
                       // to nothing)
        buffer = realloc(buffer, size);
        printf("Size: %d\n", size);
        memcpy(insertPoint, copy, size);
        printf("COPY: %s\n", buffer);

        copy += size;
        buffer = realloc(buffer, size+strlen(g));
        insertPoint += size;
        printf("%c", *insertPoint);
        memcpy(insertPoint, g, strlen(g)); //insert after the 9 letters, the string the size of g
        size += strlen(g); //size if the size of the buffer
        printf("Size2: %d\n", size);
        printf("COPY2: %s\n", buffer);

  return EXIT_SUCCESS;
}

只是一些快速的实验代码;我只是试图用“gard”替换str中的子串epl,但当我打印出来时,我正在打印的字符串缓冲区没有变化,这意味着第一个字符串im打印工作,它将所有字母放入缓冲区之前发生子字符串,但是当我尝试用子字符串替换时,它不起作用。我正在测试各个指针,它们看起来都是正确的......不确定发生了什么,有什么见解?谢谢......完全可运行的程序。

2 个答案:

答案 0 :(得分:0)

替换“epl”后,您没有附加剩余文本“ace text ...”。

您可以尝试下面的代码

_config.yml

答案 1 :(得分:0)

我认为代码中出现的问题是因为strlen不包含终止零。我试图修复你的代码,但最后我发现重新编写代码更容易(并使用更合理的变量名称)。

以下简单的四个步骤可行。 strlen的连续使用可能会被变量所取代,但为了清楚起见,我将它们留下了。 (另外,一个好的编译器可以通过保留调用来很好地优化这段代码。)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{     
    char *str = "Testing replace text...\n\n";
    char* buffer;
    char* find_str = "epl";
    char* repl_str = "gard";

    char *find_str_pos = strstr (str, find_str);

    /* 1. create new buffer of the correct size */
    buffer = malloc (strlen(str) - strlen(find_str) + strlen(repl_str) + 1);
    /* 2. copy first part */
    memcpy (buffer, str, find_str_pos - str);
    /* 3. add new text */
    memcpy (buffer + (find_str_pos - str), repl_str, strlen(repl_str));
    /* 4. append original text */
    memcpy (buffer + (find_str_pos - str) + strlen(repl_str), find_str_pos + strlen(find_str), strlen(find_str_pos) - strlen(repl_str) + 1);

    printf ("-> [%s]\n", buffer);

    return EXIT_SUCCESS;

}