如何连接2个C字符串,而不覆盖任何终止的空字符?

时间:2010-06-14 16:28:37

标签: c string

我正在尝试为SHFileOperation设置参数的文件名列表。我希望能够将文件名连接到char数组,但我不想摆脱终止字符。例如,我想要这个:
C:\ ... \ 0E:\ ... \ 0F:\ ... \ 0 \ 0

当我使用strcat()时,它会覆盖null,所以它看起来像是 C:\ ... E:\ ... F:\ ... 0 \

有没有简单的方法来做到这一点?或者我将不得不为自己编写一个新的strcat?

4 个答案:

答案 0 :(得分:1)

代码非常简单。使用辅助指针来跟踪下一个字符串应该从哪里开始。要更新跟踪器指针,请按字符串+1:

的长度递增
const char *data[] = { "a", "b", "c" };
size_t data_count = sizeof(data) / sizeof(*data);
size_t d;
size_t buffer_size;
char *buffer;
char *next;

// calculate the size of the buffer 
for (d = 0; d < data_count; ++d)
    buffer_size += (strlen(data[d] + 1);
buffer_size += 1;

buffer = malloc(buffer_size);

// Next will track where we write the next string
next = buffer;

for (d = 0; d < data_count; ++d)
{
    strcpy(next, data[d]);

    // Update next to point to the first character after the terminating NUL
    next += strlen(data[d]) + 1;
}
*next = '\0';

答案 1 :(得分:1)

使用memcpy。

memcpy(dest, src1, strlen(src1)+1);
memcpy(&dest[strlen(src1)+1], src2, strlen(src2)+1);

答案 2 :(得分:0)

使用GNU stpcpy()可能稍微优雅, if 您事先知道生成的char数组的最大'长度'。

char *src[] = {"C:\\foo", "E:\\bar", "F:\\foobar", 0};
char dst[MY_MAX_LEN], *p = dst;
int i;

for (i = 0; src[i]; i++)
    p = stpcpy(p, src) + 1;
*p = 0;
assert(p < dst + sizeof dst);

如果需要,stpcpy()可以定义为:

char *stpcpy(char * restrict dst, const char * restrict src)
{
    return strcpy(dst, src) + strlen(src);
}

答案 3 :(得分:0)

只需使用strcat附加到原始字符串,但在偏移量中添加一个,这样就可以绕过前一个字符串的0终止符。

// an example

    char testString [256];

     strcpy (testString, "Test1");

     strcat (testString + strlen(testString)+1, "Test2");
     strcat (testString + strlen(testString)+1, "Test3");

testString现在将包含“Test1 \ 0Test2 \ 0Test3 \ 0”