2016-10-23 1 views
3

In einigen Netzwerkcode muss ich Paketstrukturen in einem Puffer verschlüsseln, um (2) über einen Socket zu senden, aber memcpy'ing die codierten Puffer in einen größeren Puffer scheint problematisch. Hier ist ein kleines Codebeispiel veranschaulicht, was ich tue:C String-Verkettung mit memcpy nicht anhängig

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

Dies sollte „test“ 60-mal in buf anhängen aber buf nur ein „Test“ endet enthält. Verwende ich memcpy falsch?

Antwort

5

Sie kopieren wiederholt den Nullabschluss am Ende des Tests. sizeof tbuf ist 5.

Also alle C-Standard-Bibliothek Funktionen werden alle anderen Verkettungen ignorieren.

Die Lösung: Kopieren Sie ein Byte weniger im memcpy, und achten Sie darauf, der letzten Zeichenfolge einen Nullabschluss hinzuzufügen.

+0

memcpy (buf + Bytes_copied, tbuf, sizeof (tbuf) - 1); – yrmt

+0

Dies sollte funktionieren, da es nicht den Null-Terminator aber immer noch das gleiche Problem enthält. – yrmt

+0

Vergessen Sie nicht die folgende Zeile, in der Sie 'bytes_copied' erhöhen. – Elyasin