递归C字符串替换

时间:2011-07-02 14:02:03

标签: c string recursion replace

我对C编程很新,过去只使用C ++和String类,但我想知道如何用另一个字符串递归替换字符串。

我的代码是这样的,但它似乎没有正常工作,我无法确定它失败的地方。它在一次更换时工作正常,但不止一次,它失败了。

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

char *replace_str(char *str, char *orig, char *rep)
{
    int current_index = 0;
    static char buffer[10000];

    if (!strstr(str, orig))  // Is 'orig' even in 'str'?
    {
        return str;
    }

    while (1)
    {        
        char *p;

        if (!(p = strstr(str + current_index, orig)))  // Is 'orig' even in 'str'?
        {
            return buffer;
        }

        strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$
        buffer[p-str] = '\0';

        sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));


        printf("%d -> %s\n", current_index, buffer);

        current_index = (p - str) + strlen(rep);

        str = buffer;
    }

    return buffer;
}

int main(void)
{
    puts(replace_str("hello world world", "world", "world2"));

    return 0;
}

通过这个例子,它打印出来:

 0 -> hello world2 world
12 -> hello world2 world22
hello world2 world22

3 个答案:

答案 0 :(得分:5)

这可能不是最好的实现,但是here你找到了一个执行任务的stringReplace函数。

关于您的代码。首先,调用者提供其dest缓冲区而不是在函数中使用静态缓冲区更好。然后,您不检查缓冲区溢出。

    strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$
除第一次迭代外,

将从A复制到A。这不好,缓冲区不应该重叠。请改用memmove

但是整个想法并不干净,因为您更新了用作源的相同缓冲区以捕获其他事件。

在某些时候,你覆盖输入(当str和缓冲区指向同一个东西时)丢失信息,因为你的替换单词比要替换的原始单词长,所以你不保留“原始的下一个字符”。 (如果您尝试使用“work”而不是“world2”,它应该可以工作)...

所以你的current_index应该索引原始的字符串str(并且你永远不会做str = buffer),你将把你需要的部分附加到你的内部缓冲区(如果找到则直到“world”出现然后追加“ world2“,按”世界“的长度更新current_index并继续)。

我愿意(或多或少地试着保持原创的想法)

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

char *replace_str(char *str, const char *orig, const char *rep)
{
    size_t buf_index = 0;
    static char buffer[10000];

    if (!strstr(str, orig))  // Is 'orig' even in 'str'?
    {
        return str;
    }

    buffer[0] = 0;
    for(;;)
    {        
        char *p;

        if (!(p = strstr(str, orig)))  
        {
           strcpy(buffer + buf_index, str);
           return buffer;
        }
        strncpy(buffer + buf_index, str, p - str);
        strcpy(buffer + buf_index + (p - str), rep);
        buf_index += (p-str) + strlen(rep);
        str = p + strlen(orig);
    }
    return buffer;
}

int main(void)
{
    puts(replace_str("hello world world world", "wor", "world2"));
    return 0;
}

答案 1 :(得分:2)

问题是str = buffer;。您正在有效地更改源指针,这会搞砸您的代码。

在while循环开始之前使用以下代码

 char bk[100]
 strcpy(bk,str);

并用bk替换while循环中的所有str出现。它将起作用。

答案 2 :(得分:0)

使用这个递归函数rplcStr(),它被编码为简单的替换c ++。

string rplcStr(string x, string y, string z){
// Done by Raafat Maurice in 29 Feb 2012
// this function will replace all string (y) found in string (x) by the string (z).
        if (x.find(y.c_str(),0) != -1 ) {
            return (rplcStr (x.substr(0,  x.find(y.c_str(),0) ) + z + x.substr( x.find(y.c_str(),0) + y.size()  ) ,y,z));
        }
        else {
            return (x);
        }
}