前置字符串

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)

  • 它应该是:memmove(s + len,s,strlen(s)); 您希望将strlen(s)字节从source复制到dest. (2认同)

Zan*_*ynx 7

如果您不需要按顺序存储字符串,但只显示顺序,则使用称为"绳索"的东西.(它由很多"字符串"组成,请参阅.)

我相信它基本上是一个矢量(用C术语,数组) struct { char *begin; char *end };

在C++中,它实现了所有std :: string函数.在C中,您需要为所有strxxx()函数编写(或获取库)替换函数.

"绳索"将字符串添加到另一个字符串所做的只是插入一个新的开始,结束对指向新的字符串.它可能还必须复制新的字符串,如果它是一个临时指针.或者如果它是一个已分配的字符串,它可以获取字符串的所有权.

绳子非常适合大弦.但是,使用memmove和memcpy处理大约8 KB以下的任何内容都会更快.