Ich möchte zwei Strings anhängen. Ich habe den folgenden Befehl verwendet:
new_str = strcat(str1, str2);
Dieser Befehl ändert den Wert von str1. Ich will new_str die Verkettung von sein str1 und str2 und gleichzeitig str1 ist nicht zu ändern.
Du hast recht, das tut es.
– Charly Martin
5. Mai 2011 um 16:35 Uhr
Aus verschiedenen Gründen möchten Sie vielleicht die Größen von im Auge behalten str1, str2und new_strund verwenden strncat statt nur strcat). Es hilft, einige Pufferüberlauffehler zu vermeiden.
– Brendan Lang
5. Mai 2011 um 16:38 Uhr
Charly Martin
Sie müssen auch neuen Speicherplatz zuweisen. Betrachten Sie dieses Codefragment:
char * new_str ;
if((new_str = malloc(strlen(str1)+strlen(str2)+1)) != NULL){
new_str[0] = '\0'; // ensures the memory is an empty string
strcat(new_str,str1);
strcat(new_str,str2);
} else {
fprintf(STDERR,"malloc failed!\n");
// exit?
}
Vielleicht möchten Sie darüber nachdenken strnlen(3) was etwas sicherer ist.
Aktualisiert, siehe oben. In einigen Versionen der C-Laufzeitumgebung wird der Arbeitsspeicher von zurückgegeben malloc nicht auf 0 initialisiert. Setzen des ersten Bytes von new_str auf Null stellt sicher, dass es für strcat wie ein leerer String aussieht.
malloc kann immer Müll zurückgeben, und das tut es sogar auf modernen Systemen. calloc gibt Ihnen null Speicher.
– Körnel
22. Dezember 2012 um 23:32 Uhr
Und calloc nimmt sich auch oft Zeit dafür. Wenn Sie viele Zeichenfolgen erstellen und vorsichtig mit Ihren Zeigern umgehen, können Sie viele redundante Anweisungen einsparen.
– Charly Martin
24. Dezember 2012 um 4:01 Uhr
Bitte entfernen Sie die falsche Vermutung: “Ich glaube, die neuere C-Spezifikation erfordert tatsächlich malloc, dies zu tun”. Wenn Sie das erste Byte auf Null setzen, wird es per Definition zu einer Zeichenfolge mit der Länge Null (sieht nicht so aus).
– Michael Labbe
24. Mai 2016 um 6:07 Uhr
Macht das Erinnerung wie ein leerer String aussehen. Der von malloc zurückgegebene Speicher, auf den von a verwiesen wird void *ist nichts – per Definition.
– Charly Martin
24. Mai 2016 um 13:24 Uhr
VirtualTroll
Mach Folgendes:
strcat(new_str,str1);
strcat(new_str,str2);
Mit der Einschränkung, dass new_str mit einem leeren String initialisiert werden muss.
– individuell
5. Mai 2011 um 16:38 Uhr
Dies stürzt ab, wenn new_str das Leerzeichen oder (*new_str) != 0 nicht halten kann
– Michael Labbe
24. Mai 2016 um 5:59 Uhr
Dies gibt mir immer wieder “Segmentierungsfehler”
– Sarah
13. September 2020 um 17:47 Uhr
Erwägen Sie die Verwendung der großartigen, aber unbekannten Funktion open_memstream().
// open the stream
FILE *stream;
char *buf;
size_t len;
stream = open_memstream(&buf, &len);
// write what you want with fprintf() into the stream
fprintf(stream, "Hello");
fprintf(stream, " ");
fprintf(stream, "%s\n", "world");
// close the stream, the buffer is allocated and the size is set !
fclose(stream);
printf ("the result is '%s' (%d characters)\n", buf, len);
free(buf);
Wenn Sie nicht im Voraus wissen, wie lang das ist, was Sie anhängen möchten, ist dies bequemer und sicherer, als Puffer selbst zu verwalten.
Es ist erwähnenswert open_memstream ist Teil von POSIX, nicht des ISO-C-Standards. Es ist daher nicht auf Nicht-Unix-Systemen wie Windows verfügbar, und nicht einmal auf allen Unix-Systemen. strcat ist eine portablere Lösung.
– Denis Washington
30. Dezember 2021 um 10:46 Uhr
Joel Falkou
Du musst strncpystr1 hinein new_string Zuerst, dann.
Du könntest benutzen asprintf um beide zu einer neuen Zeichenfolge zu verketten:
Du hast recht, das tut es.
– Charly Martin
5. Mai 2011 um 16:35 Uhr
Aus verschiedenen Gründen möchten Sie vielleicht die Größen von im Auge behalten
str1
,str2
undnew_str
und verwendenstrncat
statt nurstrcat
). Es hilft, einige Pufferüberlauffehler zu vermeiden.– Brendan Lang
5. Mai 2011 um 16:38 Uhr