-2

私は以下のような簡単なmemcpyをしようとしています。

char *token[32];
char *temp_store[4];

for (i = 0 ; i < 4; i++)
{
   memcpy(token[4+i],temp_store[i],strlen(temp_store[i]));
}

トークン配列内に次の値があります。

temp_store[0] = "5";
temp_store[1] = "6";
temp_store[2] = "7";
temp_store[3] = "8";

"5" , "6", "7", "8"これらの4つの値をそれぞれにコピーしたいと思いtoken[4],token[5],token[6] and token[7]ます。

ただし、何らかの理由でtoken[]でこれらの値を取得できません。その理由がわかりません。

4

3 に答える 3

3

まず、memcpy関数を使用してC文字列をコピーする場合strlen() + 1は、バイトをコピーしてゼロターミネータ文字を含める必要があります。または、その終了ゼロを宛先配列に自分で追加する必要があります。終了ゼロがない場合、それは文字列ではありません。

第二に、ゼロで終了する文字列をコピーすることは、実際にはstrcpy関数が行うことです。memcpyなぜ代わりに使用することを選択したのですか?

第三に、本当にソース文字列を複製したい場合、コピーを実行する前に宛先メモリを割り当てることを覚えていますか?どのように割り当てたかを教えてください。これまでに投稿したコードはそのメモリを割り当てません。つまり、memcpy呼び出しによってデータが「どこにも」コピーされないため、未定義の動作が発生し、通常はクラッシュが発生します。

token[]第4に、要素が同じメモリ位置を指すようにするのではなく、これらの文字列を複製してもよろしいですか?後者は簡単に達成できます

token[4+i] = temp_store[i];

このアプローチがあなたのケースに適用できるかどうかは、あなたが何をしようとしているのかによります。

于 2012-12-20T02:19:06.220 に答える
2

ここで、temp_store [0]、temp_store [1]、temp_store [2]、temp_store [3]はそれぞれ、char配列へのポインターです。これらの4つのchar配列がnullで終了していることを確認する必要があります。

strlen()は、nullで終了する文字列の長さを決定するために使用されます

複数の配列のコンテンツをより大きな配列に変換する別の方法は、次のようにmemcpyを使用することです。

#include <stdio.h>
#include <string.h>

int main()
{
    const int LEN = 10 ;
    const int NUM_STRING = 4 ;
    char token[NUM_STRING*LEN+1]={0};
    char temp_store[NUM_STRING][LEN] = { {0} };

    for (int i = 0 ; i < NUM_STRING; i++) {
        memcpy(token+LEN*i, temp_store[i], sizeof(temp_store[i]));
    }
    return 0;
}

これにより、temp_store [0]、temp_store [1]、temp_store [2]、temp_store[3]全体がトークンにコピーされます

(つまり、temp_store[4][10]の10*4文字すべてを意味します)

于 2012-12-20T02:10:17.070 に答える
1

あなたが何をしようとしているのかわかりません。ただし、文字列を連結しようとしているだけの場合は、memcpyを使用することはできません。次のようにstrcatを使用します。

for (i = 0; i < n; i++) {
    strcat(token[i+4], temp_store[i]);
}

文字列操作を行う場合は、nullで終了する文字列とstr*関数を使用してください。Cはこれらをサポートしており、必要な文字列操作の多く(連結、長さ、割り当てによる複製、比較)がスイートに含まれているだけでなく、mem*関数よりも使用が面倒ではありません。

于 2012-12-20T02:16:57.597 に答える