连接两个字符串数组?

时间:2012-10-15 20:48:28

标签: c arrays merge memcpy

我是c世界的新手,我想将两个数组合并为一个数组,我有一个想法如何做到这一点,但它不起作用:P

char *s_one[] = { "Zorro", "Alex", "Celine" };
char *s_two[] = { "Zorro1", "Alex1"};

char *p = (char*)malloc((sizeof(s_one)+sizeof(s_two))*sizeof(char));
memcpy(p, s_one, sizeof(s_one));
memcpy(p + sizeof(s_one), s_two, sizeof(s_two));

//print out
for (count = 0; count < sizeof(p); count++)
        printf("\narr[%d] = %c.", count, p[count]);

输出只是一些随机字符...... 我做错了什么,事先感谢每一个tipp

输出应该是: 佐罗 亚历克斯 席琳 Zorro1 Alex1

5 个答案:

答案 0 :(得分:2)

让我们看看我是否能做到这一点......

s_onechar *的数组。因此,您的sizeof()memcpy()操作可能在指针上运行,而不是它们指向内存中其他位置的字符串。然后,当你去printf()时,你将指针打印为字符而不是它们指向的字符串(作为字符串)。在这里不确定,但也许这会有用吗?

printf("\narr[%d] = %s.", count, *p[count]);

如果你在我回家之前没有修好它,我会测试它并看看。


结合Marvo关于sizeof()来电的评论。


这真的取决于你想要什么,但这是我的尝试,因为我说我会发布它:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    char *s_one[] = { "Zorro", "Alex", "Celine" };
    char *s_two[] = { "Zorro1", "Alex1"};

    printf("%lu\n", sizeof(s_one));
    printf("%lu\n", sizeof(s_two));

    int numberOfEntries = (sizeof(s_one) + sizeof(s_two)) / sizeof(char*);
    char **p = (char **)malloc(numberOfEntries);

    printf("%d\n", numberOfEntries);

    memcpy(p, s_one, sizeof(s_one));
    memcpy(p + sizeof(s_one)/sizeof(char *), s_two, sizeof(s_two));

    //print out
    int count = 0;
    for (count = 0; count < numberOfEntries; count++)
        printf("arr[%d] = %s.\n", count, p[count]);
}

答案 1 :(得分:1)

你有两个指向char的指针数组(实际指向0终止char[]的第一个字符)。因此,当您memcpys_ones_two再到p时,您会复制指针,而您打印的内容则是指针值的一部分。

如果您宣布

char **p = malloc(sizeof s_one + sizeof s_two);

你会得到一个五个char*的数组,指向相应的字符串。

如果要连接s_one元素的字符串。 s_two指向,您需要分配足以保存结果(加上0终结符):

size_t needed = 1;
for(size_t i = 0; i < sizeof s_one / sizeof *s_one; ++i)
    needed += strlen(s_one[i]);
for((size_t i = 0; i < sizeof s_two / sizeof *s_two; ++i)
    needed += strlen(s_two[i]);
char *p = malloc(needed);
if (!p) {
    // allocation failed
    exit(EXIT_FAILURE);
}
p[0] = 0;
for(size_t i = 0; i < sizeof s_one / sizeof *s_one; ++i)
    strcat(p,s_one[i]);
for(size_t i = 0; i < sizeof s_two / sizeof *s_two; ++i)
    strcat(p,s_two[i]);

答案 2 :(得分:0)

我建议不要使用memcpy来迭代这两个数组中的每一个,并使用strcpy将源数组中的一个字符串复制到p中。 memcpy的问题是它应该省略复制\ 0字符,因此你的随机字符。

你的malloc指令很好。

答案 3 :(得分:0)

对于噪音较小的malloc,只需要两个提示:
您不需要转换它的返回值。
根据定义,您不需要sizeof(char)作为char是1个字节。

答案 4 :(得分:0)

我的第一个解决方案是迭代两个数组中的每一个并使用strcpy将源数组中的一个字符串复制到p ...感谢Hernan Velasquez

char *s_one[] = { "Zorro", "Alex", "Celine" };
char *s_two[] = { "Zorro1", "Alex1"};

char *p[sizeof(s_one)/sizeof(char *) + sizeof(s_two)/sizeof(char *)];
memset(p, 0, sizeof(p));
for(count=0;count < sizeof(s_one)/sizeof(char *) ;count++) {
    p[count] = (char*)malloc((strlen(s_one[count])+1)*sizeof(char));
    strcpy(p[count], s_one[count]);
}
i=count;
for(count=0;count < sizeof(s_two)/sizeof(char *) ;count++) {
    p[i] = (char*)malloc((strlen(s_two[count])+1)*sizeof(char));
    strcpy(p[i], s_two[count]);
    i++;
}

//print out
for (count = 0; count < sizeof(p)/sizeof(char *); count++)
        printf("\narr[%d] = %s.", count, p[count]);

我认为它不是很干净,但它对我有用... tomorow我用Daniel Fischer的tipp尝试它。