【发布时间】:2015-09-05 13:35:31
【问题描述】:
我正在尝试在 C 中创建一个函数来替换字符串中所有出现的子字符串。我做了我的函数,但它只适用于较大字符串中子字符串的第一次出现。
这是目前为止的代码:
void strreplace(char string*, char search*, char replace*) {
char buffer[100];
char *p = string;
while ((p = strstr(p, search))) {
strncpy(buffer, string, p-string);
buffer[p-string] = '\0'; //EDIT: THIS WAS MISSING
strcat(buffer, replace);
strcat(buffer, p+strlen(search));
strcpy(string, buffer);
p++;
}
}
我对 C 编程并不陌生,但我在这里遗漏了一些东西。
示例:对于输入字符串“marie has apples has”,搜索“has”并替换为“blabla”
第一个“有”被正确替换,但第二个不是。 最终输出是“marie blabla apples hasblabla”。注意第二个“has”仍然存在。
我做错了什么? :)
编辑 现在正在工作。添加空终止字符解决了这个问题。 我知道生成的字符串可能大于 100。这是学校作业,所以我的字符串不会超过 20 左右。
【问题讨论】:
-
@GerardvanHelden 可能是因为它们不在 C 标准库中? (你在考虑 PHP 吗?)
-
您如何看待结果?使用调试器?
-
@ace 公平点,评论已删除。认为 PHP 函数在内部映射到 C stdlib(他们经常这样做),但不是这种情况。
-
这个函数有点冒险,因为你不确定输入的字符串是否能容纳100字节。但除此之外,您的
while循环每次通过循环时只会将p增加 1。我认为它需要增加替换字符串的长度。 -
另外,
strcat(buffer, p+strlen(search));和strcpy(string, buffer);是干什么用的?你真的不需要第一行,你可以把第二行移出循环......
标签: c string str-replace