我是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
答案 0 :(得分:2)
让我们看看我是否能做到这一点......
s_one
是char *
的数组。因此,您的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[]
的第一个字符)。因此,当您memcpy
从s_one
和s_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尝试它。