一个有效地在字符串中附加字符的函数
A function to append a character in a string efficiently
如何提高此功能的速度:
void chrapp (char arr[], char chr, int pos)
{
memmove(arr + pos + 1, arr + pos, strlen(arr + pos));
*(arr + pos + 1) = chr;
}
此外,不幸的是,它无法在 数组 的最开头附加一个字符,这也是一种改进。
您的原始代码遍历字符串两次。一次用于计算字符串的长度,第二次用于移动它。您可以在一个循环中完成它,但是考虑到标准库函数是以高度优化的方式实现的,因此不确定它是否真的会加快速度。试试下面的代码:
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;
}
使用 @Dmitri 注释在移动中包含空终止符 '[=12=]'
和 *(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;
}
还有其他问题:
内存管理:现在,假设 space 存在。
检测 pos
何时超过字符串结尾。在这种情况下,只需追加。如果没有这个测试,代码结果将是灾难性的。此时很容易将字符串大小添加到函数签名并检查它(未显示)。
检测pos
何时在字符串末尾。由于代码知道字符串长度,因此执行与 #2 相同的操作。以一种特殊的方式处理简单的追加情况以加速该功能是合理的,因为它确实很常见。
使用更好的类型。 size_t
,而不是 int
。 int
而不是 char
- 通常一样快或更快,而且肯定更惯用。
字符串函数常return字符串地址。
char == '[=21=]'
应该有特殊处理。现有代码可以工作,但不需要转换。一个移位,写入一个额外的不需要的空字符。
...
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 [=11=]
arr[len+1] = '[=11=]';
}
return arr;
}
如何提高此功能的速度:
void chrapp (char arr[], char chr, int pos)
{
memmove(arr + pos + 1, arr + pos, strlen(arr + pos));
*(arr + pos + 1) = chr;
}
此外,不幸的是,它无法在 数组 的最开头附加一个字符,这也是一种改进。
您的原始代码遍历字符串两次。一次用于计算字符串的长度,第二次用于移动它。您可以在一个循环中完成它,但是考虑到标准库函数是以高度优化的方式实现的,因此不确定它是否真的会加快速度。试试下面的代码:
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;
}
使用 @Dmitri 注释在移动中包含空终止符 '[=12=]'
和 *(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;
}
还有其他问题:
内存管理:现在,假设 space 存在。
检测
pos
何时超过字符串结尾。在这种情况下,只需追加。如果没有这个测试,代码结果将是灾难性的。此时很容易将字符串大小添加到函数签名并检查它(未显示)。检测
pos
何时在字符串末尾。由于代码知道字符串长度,因此执行与 #2 相同的操作。以一种特殊的方式处理简单的追加情况以加速该功能是合理的,因为它确实很常见。使用更好的类型。
size_t
,而不是int
。int
而不是char
- 通常一样快或更快,而且肯定更惯用。字符串函数常return字符串地址。
char == '[=21=]'
应该有特殊处理。现有代码可以工作,但不需要转换。一个移位,写入一个额外的不需要的空字符。
...
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 [=11=]
arr[len+1] = '[=11=]';
}
return arr;
}