如何在速度方面改进此功能:
void chrapp (char arr[], char chr, int pos)
{
memmove(arr + pos + 1, arr + pos, strlen(arr + pos));
*(arr + pos + 1) = chr;
}
此外,遗憾的是,在数组的最开头附加一个字符也无效,这也是一个改进的方法。
答案 0 :(得分:2)
您的原始代码将通过字符串两次。一次用于计算字符串的长度,第二次用于移动它。你可以在一个循环中完成它,但是考虑到标准库函数是以高度优化的方式实现的,它不确定它实际上会加快速度。请尝试以下代码:
void chrapp (char arr[], char chr, int pos) {
char *s;
char cc;
for(s=arr+pos; *s; s++) {
cc = *s; *s = chr; chr = cc;
}
*s++ = chr;
*s = 0;
}
答案 1 :(得分:1)
使用@Dmitri评论在移动中包含空终结符'\0'
,而不是*(arr + pos)
而不是*(arr + pos + 1)
。
void chrapp(char arr[], char chr, int pos) {
memmove(arr + pos + 1, arr + pos, strlen(arr + pos) + 1);
*(arr + pos) = chr;
}
还有其他问题:
内存管理:目前,假设空间存在。
检测pos
何时结束字符串。在这种情况下,只需附加。没有这个测试,代码结果将是灾难性的。此时很容易将字符串大小添加到函数签名并检查它(未显示)。
检测pos
何时位于字符串末尾。由于代码知道字符串长度,因此与#2相同。以特殊的方式处理简单的附加案例是合理的,以加快功能,因为它当然很常见。
使用更好的类型。 size_t
,而不是int
。 int
代替char
- 通常是快速或更快,而且肯定更为惯用。
字符串函数通常返回字符串地址。
char == '\0'
应该有特殊处理。除了转换之外,现有代码不起作用。移位,写入一个不需要的额外空字符。
...
char *chrapp2(char arr[], int chr, size_t pos) {
size_t len = strlen(arr);
if (pos < len) {
// shift right
memmove(arr + pos + 1, arr + pos, len - pos + 1);
*(arr + pos) = chr;
} else {
arr[len] = chr; // Over-write \0
arr[len+1] = '\0';
}
return arr;
}