在C语言中将两个指针数组合并成第三个指针数组

在C语言中将两个指针数组合并成第三个指针数组,c,pointers,C,Pointers,我正在用C语言编写一个程序,但我不知道如何执行以下操作。我有两个以NULL结尾的字符串指针数组,即 char *tokens1[size1] char *tokens2[size2] 我想将它们合并到第三个字符串指针数组中,即 char **tokens; 我尝试了以下方法,但无效: char *tokens1[size1] char *tokens2[size2] char **tokens; /* code to fill the *tokens1[] and *tokens2[] a

我正在用C语言编写一个程序,但我不知道如何执行以下操作。我有两个以NULL结尾的字符串指针数组,即

char *tokens1[size1]
char *tokens2[size2]
我想将它们合并到第三个字符串指针数组中,即

char **tokens;
我尝试了以下方法,但无效:

char *tokens1[size1]
char *tokens2[size2]
char **tokens;

/* code to fill the *tokens1[] and *tokens2[] arrays with string values */

tokens = (char*) malloc(size1+size2+1);
strcpy(tokens, tokens1);
strcat(tokens, tokens2);
你能帮我吗?

使用

char *tokens[size1+size2]

tokens = (char*) malloc(size1+size2+1);
这是不对的。如果您使用第一个指针,那么您已经定义了指针数组,并且静态分配了
(size1+size2)
字符串指针。因此,不能使用malloc动态地重新分配

如果要使用malloc动态分配字符串指针数组,则必须定义
标记
,如下所示:

char **tokens
双指针。这意味着指向包含字符串指针的数组的指针

对于分配,您可以这样做:

tokens = (char**) malloc((size1+size2+1)*sizeof(char *));
用于:

您想将指针数组复制到另一个指针数组。但您已经使用函数将字符数组复制到字符数组。字符类型和指针类型不一样。字符大小为1字节,指针大小为4字节/8字节(取决于您使用的系统)

strcat也一样

memcpy
无法帮助您,因为您希望复制
tokens1
数组,直到找到
NULL
地址,而不是复制整个数组

如果您只想复制字符串的指针(地址):下面是您的方法

//to copy tokens1 (terminated with NULL address)
for (i=0;tokens1[i]!=NULL;i++)
{
   tokens[i]=tokens1[i];
}
//to concat tokens2 (terminated with NULL address)
for (j=0;tokens2[j]!=NULL;j++)
{
   tokens[i+j]=tokens2[j];
}
tokens[i+j]=NULL;
for (i=0;tokens1[i]!=NULL;i++)
{
   tokens[i]=strdup(tokens1[i]);
}
for (j=0;tokens2[j]!=NULL;j++)
{
   tokens[i+j]=strdup(tokens2[j]);
}
tokens[i+j]=NULL;
如果您想将
tokens1
tokens2
的字符串复制到
tokens
中,您可以使用
strdup()
函数:下面介绍如何操作

//to copy tokens1 (terminated with NULL address)
for (i=0;tokens1[i]!=NULL;i++)
{
   tokens[i]=tokens1[i];
}
//to concat tokens2 (terminated with NULL address)
for (j=0;tokens2[j]!=NULL;j++)
{
   tokens[i+j]=tokens2[j];
}
tokens[i+j]=NULL;
for (i=0;tokens1[i]!=NULL;i++)
{
   tokens[i]=strdup(tokens1[i]);
}
for (j=0;tokens2[j]!=NULL;j++)
{
   tokens[i+j]=strdup(tokens2[j]);
}
tokens[i+j]=NULL;
使用

tokens = (char*) malloc(size1+size2+1);
这是不对的。如果您使用第一个指针,那么您已经定义了指针数组,并且静态分配了
(size1+size2)
字符串指针。因此,不能使用malloc动态地重新分配

如果要使用malloc动态分配字符串指针数组,则必须定义
标记
,如下所示:

char **tokens
双指针。这意味着指向包含字符串指针的数组的指针

对于分配,您可以这样做:

tokens = (char**) malloc((size1+size2+1)*sizeof(char *));
用于:

您想将指针数组复制到另一个指针数组。但您已经使用函数将字符数组复制到字符数组。字符类型和指针类型不一样。字符大小为1字节,指针大小为4字节/8字节(取决于您使用的系统)

strcat也一样

memcpy
无法帮助您,因为您希望复制
tokens1
数组,直到找到
NULL
地址,而不是复制整个数组

如果您只想复制字符串的指针(地址):下面是您的方法

//to copy tokens1 (terminated with NULL address)
for (i=0;tokens1[i]!=NULL;i++)
{
   tokens[i]=tokens1[i];
}
//to concat tokens2 (terminated with NULL address)
for (j=0;tokens2[j]!=NULL;j++)
{
   tokens[i+j]=tokens2[j];
}
tokens[i+j]=NULL;
for (i=0;tokens1[i]!=NULL;i++)
{
   tokens[i]=strdup(tokens1[i]);
}
for (j=0;tokens2[j]!=NULL;j++)
{
   tokens[i+j]=strdup(tokens2[j]);
}
tokens[i+j]=NULL;
如果您想将
tokens1
tokens2
的字符串复制到
tokens
中,您可以使用
strdup()
函数:下面介绍如何操作

//to copy tokens1 (terminated with NULL address)
for (i=0;tokens1[i]!=NULL;i++)
{
   tokens[i]=tokens1[i];
}
//to concat tokens2 (terminated with NULL address)
for (j=0;tokens2[j]!=NULL;j++)
{
   tokens[i+j]=tokens2[j];
}
tokens[i+j]=NULL;
for (i=0;tokens1[i]!=NULL;i++)
{
   tokens[i]=strdup(tokens1[i]);
}
for (j=0;tokens2[j]!=NULL;j++)
{
   tokens[i+j]=strdup(tokens2[j]);
}
tokens[i+j]=NULL;

您正在复制指针值,而不是字符串,因此需要使用
memcpy
而不是
strcpy
/
strcat

int i, j;
/* Find the current size of tokens1 and tokens 2 */
for (i=0; tokens1[i] != NULL; i++) 
   ;
for (j=0; tokens2[j] != NULL; j++) 
   ;
/* Allocate enough memory to hold the result */
tokens = calloc(i + j + 1, sizeof(char*));
/* Copy the arrays */
memcpy(tokens, tokens1, i * sizeof(char*));
memcpy(tokens + i, tokens2, j * sizeof(char*));
/* Since we used calloc, the new array is initialized with NULL:s. Otherwise we would have to NULL-terminate it like so: */
tokens[i+j] = NULL;

您正在复制指针值,而不是字符串,因此需要使用
memcpy
而不是
strcpy
/
strcat

int i, j;
/* Find the current size of tokens1 and tokens 2 */
for (i=0; tokens1[i] != NULL; i++) 
   ;
for (j=0; tokens2[j] != NULL; j++) 
   ;
/* Allocate enough memory to hold the result */
tokens = calloc(i + j + 1, sizeof(char*));
/* Copy the arrays */
memcpy(tokens, tokens1, i * sizeof(char*));
memcpy(tokens + i, tokens2, j * sizeof(char*));
/* Since we used calloc, the new array is initialized with NULL:s. Otherwise we would have to NULL-terminate it like so: */
tokens[i+j] = NULL;

我只是假设
内存
为每个
指针分配得很好

    int i;
    for (i=0 ; i< size1 ;i++)
    {
     strcpy (tokens[i],tokens1[i]);
    }
    int j=i;
    for(i=0;i<size2;i++,j++)
    {
     strcpy(tokens[j],tokens2[i]);
    }
    tokens[j]='\0';
inti;
对于(i=0;i对于(i=0;i我只是假设
内存
被很好地分配给每个
指针

    int i;
    for (i=0 ; i< size1 ;i++)
    {
     strcpy (tokens[i],tokens1[i]);
    }
    int j=i;
    for(i=0;i<size2;i++,j++)
    {
     strcpy(tokens[j],tokens2[i]);
    }
    tokens[j]='\0';
inti;
对于(i=0;i
对于(i=0;从技术上讲,这是正确的,您有指向字符的指针数组。C没有字符串类型。@克里斯,我相信我们应该理解,这是在注释区域发生的。@cmh,啊,我读了这一部分,作为下一节的前奏。strcat/strcpy用于复制“字符串”而不是指针数组。您是否要复制字符串还不清楚只需将指针复制到字符串或创建这些字符串的副本并存储新指针。要做到技术上正确,您有指向char的指针数组。C没有字符串类型。@chris,我相信我们应该理解这是在注释区域发生的。@cmh,啊,我读了这一部分作为下一节的前奏。strcat/strcpy用于复制“字符串”而不是指针数组。目前还不清楚您是只想将指针复制到字符串,还是创建这些字符串的副本并存储新指针。这是可行的,但不会进行不必要的复制。Klas的答案更为有效,因为它只复制指针,而不是复制具有指针的整个字符串已经被读入内存。@TomDignan:是的,你是对的。。但是我想在解决问题的同时实现strcpy,而不是考虑memcpyth。这是可行的,但不需要复制。Klas的答案更有效,因为它只复制指针,而不是复制已经读入内存的整个字符串。@TomDignan:是的你是对的。但是我在解决问题的同时想到了实现strcpy,而不是想到memcpyoops,我错过了这个
tokens=(char*)malloc(size1+size2+1);
make meconfused@MohamedKALLEL:抱歉!我搞错了。这不是令牌数组的静态分配。我想使用malloc()为此数组分配内存。我尝试了
tokens=(char*)malloc(size1+size2+1);
但我从gcc得到了以下警告:
来自不兼容指针类型的赋值[默认启用]
。有什么想法吗?@Stavros所以你必须删除char
*tokens[size1+size2]
,并用
char**tokens
:双指针;-)。我会用这个更新我的答案,因为我错过了这个
tokens=(char*)malloc(size1+size2+1);
make meconfused@MohamedKALLEL:抱歉!我搞错了。这不是令牌数组的静态分配。我