0

私は C でプログラムを書いていますが、次のことを行う方法がわかりません。文字列へのポインターの NULL 終了配列が 2 つあります。つまり、

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

それらを文字列へのポインターの3番目の配列にマージしたい、つまり

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

手伝っていただけませんか?

4

3 に答える 3

4

文字列ではなくポインター値をコピーしているため、 /memcpyの代わりに使用する必要があります。strcpystrcat

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 バイトで、ポインターのサイズは 4 バイト/8 バイトです (使用するシステムによって異なります)。

についても同じstrcat

配列全体をコピーするのではなく、アドレスが見つかるまで配列memcpyをコピーする必要があるため、これは役に立ちませんでしたtokens1NULL

文字列のポインタ(アドレス)のみをコピーしたい場合:ここでそれを行う方法の後に

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

tokens1との文字列をコピーtokens2したい場合は、関数tokensを使用できstrdup()ます: here after how 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 に答える