2017-10-18 4 views
0

Tor Überschreiben ist C zu verwenden, um Daten aus einer Datei zu lesen (könnte Text oder binär) und hängen Sie dann an eine bestehende Zeichenfolge2. char-Array 1. char-Array nach fread aus Datei

Ich habe 2 char-Arrays, eines ein bestehende Zeichenfolge (s1), und eine andere eine Zeichenkette (s2) ich werde den Puffer char-Array (buf) zu

size_t readCounter = 0; 
char buf[16]; 
char s1[] = "hello "; 
char s2[] = "" 

while (1) { 
    readCounter = fread(buf, sizeof(char), strlen(buf), fp); 

    if (readCounter == 0) { 
     break; 
    } 

    strcat(s2, buf);  
} 

printf("%s", s1); 
printf("%s", s2); 

Problem anhängen:

Wenn ich s1 ausdrucken, ist es nicht mehr „Hallo "Es enthält die Zeichen aus der Datei, aus irgendeinem Grund wird das erste Char-Array im Speicher überschrieben. Warum passiert das? Wie kann ich das beheben?

+2

'buf' wird nie initialisiert, also fragst du hier nach Explosionen, wenn du' strlen' darauf anrufst. – tadman

+0

okay, ich gebe 16 (Größe des Puffers) statt Strlen (Buf) – user3226932

+0

Es ist wahrscheinlich besser, magische Zahlen wie diese zu vermeiden und stattdessen 'sizeof (buf)' zu verwenden. – tadman

Antwort

4
readCounter = fread(buf, sizeof(char), strlen(buf), fp); 

Dies ist ein Problem. Zu diesem Zeitpunkt enthält buf keine Zeichenfolge, daher ist die Übergabe an strlen ein Fehler.

auch:

char s2[] = ""; 
... 
strcat(s2, buf); 

Das ist nicht gut. Als Sie alle s2 ausfindig gemacht haben, zeigte es auf einen leeren String. Also war das Array so dimensioniert, dass es eine leere Zeichenfolge enthielt. Indem Sie s2 an strcat übergeben, versuchen Sie, es anzufügen - aber es hat keinen zusätzlichen Speicherplatz.

+0

ich sehe, aber was hat das mit s1 zu tun und warum ist s1 überschrieben? – user3226932

+0

@ user3226932 Nachdem Sie einen solchen Fehler gemacht haben, können Sie nicht zuverlässig auf irgendetwas zugreifen. Der Compiler ist frei zu optimieren, vorausgesetzt, Sie werden dies nie tun und sobald Sie diese Annahme verletzen, sind alle Wetten deaktiviert. Vielleicht hat der 'strcat' zufällig über den Speicher geschrieben, den' s2' damals benutzt hat. Vielleicht nicht. –

+0

Undefiniertes Verhalten. "Was hat das mit s1 zu tun und warum wird s1 überschrieben?" Was? s2 und s1 sind nebeneinander, also ist es nicht verwunderlich, dass der Überlauf den anderen auslöst. –

Verwandte Themen