【发布时间】:2015-07-30 22:33:14
【问题描述】:
我正在尝试查找替换,但不仅适用于字符串,还适用于子字符串。所以我正在处理的程序会查找单词“bar”并在“bar”的任何实例前面附加“foo”。所以我的方法是,我没有实际附加字符串,而是用“foobar”替换整个字符串“bar”。我现在拥有的代码(未完全测试)应该找到所有出现的“bar”并将其替换为“foobar”。但是,如果有一个看起来像“bar123abc”的字符串,它不会用“foobar123abc”替换它。
这是我的代码:
static void replaceAllString(char *buf, const char *orig, const char *replace)
{
int olen, rlen;
char *s, *d;
char *tmpbuf;
if (!buf || !*buf || !orig || !*orig || !replace)
return;
tmpbuf = malloc(strlen(buf) + 1);
if (tmpbuf == NULL)
return;
olen = strlen(orig);
rlen = strlen(replace);
s = buf;
d = tmpbuf;
while (*s) {
if (strncmp(s, orig, olen) == 0) {
strcpy(d, replace);
s += olen;
d += rlen;
}
else
*d++ = *s++;
}
*d = '\0';
strcpy(buf, tmpbuf);
free(tmpbuf);
}
【问题讨论】:
-
那么在不工作的情况下它会做什么呢?您是否真的尝试在调试器中或使用 printfs 对其进行调试?这看起来不对:
tmpbuf = malloc(strlen(buf) + 1);。tmpbuf结果对吗?结果不需要比输入 buf 长吗? -
你意识到这个功能是一个即时的安全噩梦,对吧?我想知道你为什么选择 C 来做它最不适合的工作之一。
-
@LeeDanielCrocker:我认为在 C 中实现这一点通常没有什么问题。但我同意给定函数的噩梦。