0

I'm writing a program in C and I can't find out how to do the following. I have two NULL terminated arrays of pointers to strings, namely

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

I want to merge them into a third array of pointers to strings, namely

char **tokens;

I've tried the following but it doesn't work:

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);

Could you please help me?

4

3 回答 3

4

您正在复制指针值,而不是字符串,因此您需要使用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;
于 2012-10-29T14:48:12.210 回答
1

使用

char *tokens[size1+size2]

tokens = (char*) malloc(size1+size2+1);

是不正确的。. 如果您使用第一个,那么您已经定义了具有静态分配(size1+size2)字符串指针的指针数组。所以你不能用 malloc 动态重新分配。

如果要使用 malloc 动态分配字符串指针数组,则必须这样定义tokens

char **tokens

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

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

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

为了:

strcpy(tokens, tokens1);

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

同样的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;

如果你想复制 and 的字符串,tokens1tokens2可以tokens使用strdup()function: here after you can do it

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;
于 2012-10-29T14:46:25.597 回答
0

我只是假设memory每个人都分配得很好pointers

    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';
于 2012-10-29T14:49:04.250 回答