Rya*_*yan 31 c string concatenation
使用尽可能少的内存前缀到C字符串的最有效方法是什么?
我正在尝试重建大型目录树中文件的路径.
这是我以前做过的事情的想法:
char temp[LENGTH], file[LENGTH];
file = some_file_name;
while (some_condition) {
parent_dir = some_calculation_that_yields_name_of_parent_dir;
sprintf(temp, "%s/%s", parent_dir, file);
strcpy(file, temp);
}
Run Code Online (Sandbox Code Playgroud)
这看起来有点笨拙.
任何帮助,将不胜感激.谢谢!
Eli*_*sky 14
如果你想要它在同一个内存块中,很难避免复制.如果分配的块足够大,您可以使用memmove将原始字符串移动到您想要的前缀长度,然后将其复制到开头,但我怀疑这不是"笨重".然而,它会为你节省额外的内存(再次,授予原始块有足够的可用空间).
像这样的东西:
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
/* Prepends t into s. Assumes s has enough space allocated
** for the combined string.
*/
void prepend(char* s, const char* t)
{
size_t len = strlen(t);
size_t i;
memmove(s + len, s, strlen(s) + 1);
for (i = 0; i < len; ++i)
{
s[i] = t[i];
}
}
int main()
{
char* s = malloc(100);
strcpy(s, "file");
prepend(s, "dir/");
printf("%s\n", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您不需要按顺序存储字符串,但只显示顺序,则使用称为"绳索"的东西.(它由很多"字符串"组成,请参阅.)
我相信它基本上是一个矢量(用C术语,数组) struct { char *begin; char *end };
在C++中,它实现了所有std :: string函数.在C中,您需要为所有strxxx()函数编写(或获取库)替换函数.
"绳索"将字符串添加到另一个字符串所做的只是插入一个新的开始,结束对指向新的字符串.它可能还必须复制新的字符串,如果它是一个临时指针.或者如果它是一个已分配的字符串,它可以获取字符串的所有权.
绳子非常适合大弦.但是,使用memmove和memcpy处理大约8 KB以下的任何内容都会更快.