1

memcpy関数を使用して文字を連結しようとしていますが、memcpyを数回実行すると、バッファの長さが奇妙になります。以下のコードを参照してください

int main()
{
uint8 txbuffer[13]={0};
uint8 uibuffer[4] = "abc";
uint8 rxbuffer[4] = "def";
uint8 l[2]="g";
int index = 1;

cout << strlen((char*)txbuffer) <<endl;
memcpy(&txbuffer[1],&uibuffer, strlen((char*)uibuffer));
index+=strlen((char*)uibuffer);

cout <<"after first memcpy: "<< strlen((char*)txbuffer) <<endl;
memcpy(&txbuffer[index],&rxbuffer, strlen((char*)uibuffer));

cout <<"after second memcpy: "<< strlen((char*)txbuffer) <<endl;
memcpy(&txbuffer[0],&l, strlen((char*)l));

cout <<"after third memcpy: "<< strlen((char*)txbuffer) <<endl;
for (int i = 0; i < sizeof(txbuffer); i += 1)
{
    cout << (int(txbuffer[i]))<<" : "<< char(int(txbuffer[i]))<<endl;
}
return 0;
}

出力は次のとおりです。

after first memcpy: 0
after second memcpy: 0
after third memcpy: 7
103 : g
97 : a
98 : b
99 : c
100 : d
101 : e
102 : f
0 : 
0 : 
0 : 
0 : 
0 : 
0 :

私の質問は、最初のmemcpyの後、バッファのstrlenがまだゼロである理由です。

4

4 に答える 4

2

0ターミネータをコピーしなかったため、元のバイトからバイトを取得したstrlen後に宛先を指定しないでください。memcpystrlen

さらに、配列が最初にゼロになっているため、0ではなくバイト1からコピーします。つまり、0を意味しstrlenます(このような場合、最初の段落は無関係になりますが、注意する必要があります)。

于 2011-11-24T21:00:33.430 に答える
1

これは、の最初の文字txbufferがヌル文字であるため\0です。(この方法で初期化しました。)したがって、文字列を印刷すると、文字列の長さは事実上ゼロになります。

最初または2番目のコピーの最初の文字を上書きしませんでした。しかし、最終的に3番目のコピーで上書きします。そのため、3番目のコピーが終わるまで長さはゼロです。

//  Start
{  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}

//  After 1st memcpy(): strlen() is still zero
{  0, 'a', 'b', 'c',   0,   0,   0,   0,   0,   0,   0,   0,   0}
   ^ first null character

//  After 2nd memcpy(): strlen() is still zero
{  0, 'a', 'b', 'c', 'd', 'e', 'f',   0,   0,   0,   0,   0,   0}
   ^ first null character

//  After 3rd memcpy(): strlen() is now 7
{'g', 'a', 'b', 'c', 'd', 'e', 'f',   0,   0,   0,   0,   0,   0}
                                      ^ first null character
于 2011-11-24T21:00:35.080 に答える
0

strlen()非NULバイトの数をカウントします。最初のNULはコピー後に残るため、もちろんstrlen()ゼロを返します。

sizeof代わりに、またはより明示的な連結ロジックを使用することをお勧めします。

int main()
{
    char txbuffer[13];
    char uibuffer[4] = "abc";
    char rxbuffer[4] = "def";
    char l[2]="g";
    int index = 1;

    int n = sprintf (txbuffer, "%s%s%s", uibuffer, rxbuffer, l);
    cout << "buffer has " << n << " bytes" << endl;
    return 0;
}
于 2011-11-24T21:00:39.860 に答える
0

ここには複数の問題があります。

まず、memcpyの引数として&uibufferを使用するのは間違ってuibuffer (rxbuffer,l)います。すでにアドレス(配列である)であるため、使用するだけです。

memcpy(&txbuffer[1], uibuffer, strlen((char*)uibuffer));

上記のtxbufferでstrlenを実行すると(オフセット1でtxtbufferにコピーするため)、strlenは\ 0が見つかるまでカウントされるため、長さは0になります。strlenをmemcpyと組み合わせて使用​​することはお勧めできません。代わりに、長さを追跡してください。手動でtxtbufferに入れると、コピーする文字列の長さとオフセットがわかります。

于 2011-11-24T21:11:01.860 に答える