2

我是 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]);

输出只是一些随机字符......我做错了什么,提前感谢每个提示

输出应该是: Zorro Alex Celine Zorro1 Alex1

4

5 回答 5

2

让我们看看我能不能做到这一点......

s_one是一个数组char *。因此,您的sizeof()andmemcpy()操作很可能对指针进行操作,而不是它们指向内存中其他位置的字符串。然后,当您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]);
}
于 2012-10-15T21:02:58.417 回答
1

您有两个指针数组char(实际上指向 0-terminated 的第一个字符char[])。所以当你memcpyfroms_ones_twoto时p,你复制了指针,你打印出来的是指针值的一部分。

如果你声明

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

你会得到一个由五个组成的数组char*,指向各自的字符串。

如果你想连接相应的元素的字符串s_ones_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]);
于 2012-10-15T21:03:09.993 回答
0

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

你的 malloc 指令很好。

于 2012-10-15T20:54:35.977 回答
0

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

于 2012-10-15T21:18:21.897 回答
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]);

我认为它不是很干净,但它对我有用……明天我用 Daniel Fischer 的小费试试

于 2012-10-15T21:56:52.453 回答