当子字符串与替换字符串相似时如何替换C中的子字符串?

Nas*_*sim 2 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);
Run Code Online (Sandbox Code Playgroud)

mer*_*011 5

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

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

#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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

There There End Is Nigh
Run Code Online (Sandbox Code Playgroud)