我在C中创建了一个程序,它使用strstr
,strncpy
和sprintf
函数将所有子字符串替换为替换字符串。我的程序唯一的缺陷就是当你想要更换例如搜索“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);
答案 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对此的期望是什么。