2016-10-23 6 views
3

ネットワークコードによっては、ソケット上で(2)を送信するためにバッファにパケット構造をエンコードする必要がありますが、エンコードされたバッファをより大きなバッファにmemcpyすることは問題があります。ここで は私がやっているものを示す小さなコードの例です:C memcpyを使用した文字列連結が付加されない

char tbuf[] = "test"; 
char *buf = malloc(300); 
memset(buf, '\0', 300); 

int  bytes_to_copy = 300; 
int  bytes_copied = 0; 

while (bytes_copied < bytes_to_copy) { 
    memcpy(buf + bytes_copied, tbuf, sizeof(tbuf)); 
    bytes_copied += sizeof(tbuf); 
} 
/* free, return */ 

これはBUFに「テスト」60回を追加する必要がありますが、bufが一つだけ「test」を含む終わります。私はmemcpyを間違って使用していますか?

答えて

5

テスト終了時にヌルターミネータを繰り返しコピーしています。 sizeof tbufは5です。

したがって、すべてのC標準ライブラリ関数は、他のすべての連結子を無視します。

解決策:memcpyに1バイト少ないバイトをコピーし、最後の文字列にヌルターミネータを追加してください。

+0

memcpy(buf + bytes_copied、tbuf、sizeof(tbuf) - 1); – yrmt

+0

これはnulターミネーターが含まれていないのに同じ問題が残っているので、これはうまくいくはずです。 – yrmt

+0

'bytes_copied'をインクリメントする次の行を忘れないでください。 – Elyasin

関連する問題