2

私はcの世界に不慣れで、2つの配列を1つの配列にマージしたいのですが、これを行う方法が1つありますが、機能しません: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に事前に感謝します

出力は次のようになります。ZorroAlexCelineZorro1 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

へのポインターの配列が 2 つありますchar(実際には、0 で終わる の最初の文字を指していますchar[])。したがって、memcpyfroms_ones_twotopを実行すると、ポインターがコピーされ、出力されるのはポインター値の一部になります。

宣言したら

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

char*それぞれの文字列を指す Fiveの配列を取得します。

s_onerespの要素である文字列を連結したい場合。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]);
于 2012-10-15T21:03:09.993 に答える
0

私の最初の解決策は、2 つの配列のそれぞれを繰り返し処理し、strcpy を使用してソース配列から 1 つの文字列を 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 に答える
0

memcpy を使用する代わりに、2 つの配列のそれぞれを反復処理し、strcpy を使用してソース配列から 1 つの文字列を p にコピーすることをお勧めします。memcpy の問題は、\0 文字のコピーを省略する必要があるため、ランダムな文字になることです。

malloc 命令は問題ありません。

于 2012-10-15T20:54:35.977 に答える
0

ノイズの少ない malloc の 2 つのヒント:
戻り値をキャストする必要はありません。
定義によるcharは1バイトであるため、 sizeof(char) は必要ありません。

于 2012-10-15T21:18:21.897 に答える