我在网上找到的大多数模块都会取代该字符串的第一次出现。但我想要一个模块,它将搜索每一个匹配项,并将替换该字符串。我发现堆栈溢出的代码非常繁琐,所以我没有调查它。我工作的环境只支持C编译器。所以C ++命令调整评论不受欢迎。这就是我来的。它仍然让我错误。任何帮助表示赞赏。
#include <stdio.h>
#include <string.h>
char *replace_str(char *str, char *orig, char *rep)
{
char *buffer;
char *p, *work;
while(strstr(str,orig))
{
p = strstr(str, orig);
strncpy(work, str, p-str);
strcat(buffer, work);
//strncpy(buffer+strlen(buffer), str, p-str);
strcat(buffer, rep);
p+=strlen(orig);
str = p;
}
return strcat(buffer,p);
}
int main(void)
{
puts(replace_str("Hello, Kate! I once had a cat named Kate! ", "Kate", "Paul"));
return 0;
}
答案 0 :(得分:2)
您的代码会产生未定义的行为,因为您尝试从/向buffer
和work
复制,而不为它们分配内存。使用malloc
并且不要再忘记free
所有内容。
如果替换被限制为与要替换的字符串相同的长度,那么您根本不需要缓冲区。否则,您必须确保稍后在调用部分中free
返回的字符串。