当子字符串类似于替换字符串时,如何替换C中的子字符串?

时间:2014-04-23 23:44:28

标签: c string substring

我在C中创建了一个程序,它使用strstrstrncpysprintf函数将所有子字符串替换为替换字符串。我的程序唯一的缺陷就是当你想要更换例如搜索“The”并希望用“There”替换它,这会导致无限循环,因为程序会不断找到它刚刚替换的内容。我怎么能在C中解决这个问题,还是有另一种方法在C中实现这样的功能?感谢。

替换功能:(多次调用,直到找不到任何匹配项。)

char *searchAndReplace(char *text, char *search, char *replace){
  char buffer[MAX_L];
    char *ptr;
    char *modText = malloc(4096);
    if(!(ptr = strstr(text, search))){
        return;
    }
    strncpy(buffer, text, ptr-text);
    sprintf(buffer+(ptr-text), "%s%s", replace, ptr + strlen(search));
    strcpy(text, buffer);

2 个答案:

答案 0 :(得分:4)

您可以在上一次替换之后返回指向原始字符串中某个位置的指针,然后在下次使用该指针而不是原始指针时调用您的函数。

请注意,在下面的代码中,您通常应该使用strncpy而不是strcpy,但我尝试尽可能多地保留原始代码,因此我简化了假设。 / p>

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


#define MAX_L 4096
char *searchAndReplace(char *text, char *search, char *replace){
    char buffer[MAX_L];
    char *ptr;
    if(!(ptr = strstr(text, search))){
        return NULL;
    }
    strncpy(buffer, text, ptr-text);
    sprintf(buffer+(ptr-text), "%s%s", replace, ptr + strlen(search));
    strcpy(text, buffer);
    return ptr + strlen(search);
}

int main(){
    char* original = malloc(MAX_L);
    memset(original, 0, MAX_L);
    strcpy(original, "The The End Is Nigh");


    char* current = original;
    do {
        current = searchAndReplace(current, "The", "There");
    } while (current);

    printf("%s\n", original);
}

输出:

There There End Is Nigh

答案 1 :(得分:1)

您可以查找搜索字符串,将该点复制到缓冲区,附加替换字符串,将指针前进到找到字符串的位置之后的点。在您找不到搜索字符串之前,请循环执行此操作。

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

#define MAX_L 1000

char *searchAndReplace(char *text, char *search, char *replace)
{
   char buffer[MAX_L];
   char *ptr;
   char *modText = NULL;

   buffer[0] ='\0';
   while ( ptr = strstr(text, search) )
   {
      strncat(buffer, text, ptr-text);
      strcat(buffer, replace);

      // If you are looking for "xx" in "xxxx",
      // There are two ways of looking at this search.
      //                                 xxxx
      // You can either look at it as    ^^
      //                                   --
      // i.e. two matches, or
      //                                 xxxx
      //                                 ^^
      //                                  --
      //                                   ++
      // i.e. three matches

      // If the first interpretation is desired...
      // text = ptr + strlen(search);

      // If the second interpretation is desired...
      text = ptr + 1;

   }
   strcat(buffer, text);

   modText = malloc(strlen(buffer) + 1);
   strcpy(modText, buffer);
   return modText;
}

int main(int argc, char** argv)
{
   char* out = searchAndReplace(argv[1], argv[2], argv[3]);
   printf("%s\n", out);

   // Free the memory allocated and returned from searchAndReplace
   free(out);
}

当我跑步时

./test "ab cc ccd" c xyz

我得到以下输出

ab xyzxyz xyzxyzd

更新

只是为了测试一下如果我尝试过WhozCraig的建议会发生什么。

>> ./test "xxxxxx" xx xxx
xxxxxxxxxxxxxxxx

我不确定OP对此的期望是什么。