【发布时间】:2012-05-05 15:19:34
【问题描述】:
我正在尝试编写一个接受三个 c 样式字符串并返回一个 c 样式字符串的函数。此函数在 c 字符串中搜索所有出现的子字符串,并用不同的字符串替换它们。
这个程序有效,但看起来很不优雅。我情不自禁地感觉它本来可以用不那么笨重的方式完成。
char* replaceSubstring(char *original, char *from, char *to)
{
int origlen = strlen(original);
int i = 0;
int count = 0;
char *ptr;
//figure out how many times the sub-string occurs in a string.
//i couldn't figure out a way to avoid this loop
while (i<origlen)
{
ptr = strstr(original+i, from);
if (!ptr)
break;
else
{
i = ptr - original + 1;
count++;
}
}
//figure out what the size of the output string has to be
int newsize = origlen + (strlen(to) - strlen(from)) * count;
char *newstring = new char[newsize];
newstring[0] = '\0';
i = 0;
while (i < origlen)
{
ptr = strstr(original+i, from);
if (!ptr)
{
strcat(newstring,original+i);
break;
}
else
{
//this looks extremely ugly and bulky...
strncat(newstring, original+i, ptr-(original+i));
strcat(newstring, to);
i = i + ptr - (original + i) + strlen(from);
}
}
strcat(newstring,"\0");
return newstring;
}
有人对如何使这段代码更清晰和/或更高效有任何建议吗? 欢迎任何cmets。 请不要建议改用类字符串。这不是一个选择。该函数必须与 c-strings 一起使用
【问题讨论】:
-
多次使用
strcat可能会影响性能,因为对于每次调用,您都必须迭代整个字符串。此外,strcat(newstring, "\0")实际上什么都不做,因为无论如何newstring必须以NULL 结尾才能与strcat一起使用。 -
不能使用字符串类?这样的要求让我怀疑这是不是作业……是吗?
-
不,这不是家庭作业,我刚刚意识到我已经有一段时间没有使用 c-strings 了,我必须重新了解它们是如何工作的。所以我为自己创建了一些练习,只是为了看看我可以做与 std::string 相同的基本操作
-
+1 表示想要[重新]学习指针。
-
函数的整体冗长和简单是合理的——基本上和问题一样混乱。 Seth 的 cmets 完全有效(注意 strcat 将保持输出终止 - 无论如何都不需要
strcat(newstring, "\0"),并且您可以通过调用str[n]cat(newstring + characters_so_far, ...来避免降低性能的 Seth 警告)。此外,当您new时,您必须为 NUL 终止符分配一个额外的字节,并考虑在while循环之外调用strlen(from)并保存该值。你的函数参数应该是const。
标签: c++ c search pointers c-strings