Wie füge ich zwei Zeichenfolgen hinzu?
Ich habe es versucht name = "derp" + "herp";
, aber ich habe eine Fehlermeldung erhalten:
Der Ausdruck muss einen Integral- oder Aufzählungstyp haben
C unterstützt keine Zeichenfolgen, die einige andere Sprachen haben. Eine Zeichenfolge in C ist nur ein Zeiger auf ein Array char
, das durch das erste Nullzeichen abgeschlossen wird. In C gibt es keinen String-Verkettungsoperator.
Verwenden Sie strcat
diese Option, um zwei Zeichenfolgen zu verketten. Sie können die folgende Funktion verwenden, um dies zu tun:
#include <stdlib.h>
#include <string.h>
char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
strcpy(result, s1);
strcat(result, s2);
return result;
}
Dies ist nicht der schnellste Weg, aber darüber sollten Sie sich jetzt keine Sorgen machen. Beachten Sie, dass die Funktion einen Block des Heap-zugewiesenen Speichers an den Aufrufer zurückgibt und den Besitz dieses Speichers weitergibt. Es liegt in der Verantwortung des Anrufers, free
den Speicher zu speichern, wenn er nicht mehr benötigt wird.
Rufen Sie die Funktion folgendermaßen auf:
char* s = concat("derp", "herp");
// do things with s
free(s); // deallocate the string
Wenn Sie zufällig von der Leistung gestört werden, sollten Sie vermeiden, die Eingabepuffer wiederholt nach dem Nullterminator zu durchsuchen.
char* concat(const char *s1, const char *s2)
{
const size_t len1 = strlen(s1);
const size_t len2 = strlen(s2);
char *result = malloc(len1 + len2 + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
memcpy(result, s1, len1);
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
return result;
}
Wenn Sie vorhaben, viel mit Zeichenfolgen zu arbeiten, ist es möglicherweise besser, eine andere Sprache zu verwenden, die erstklassige Unterstützung für Zeichenfolgen bietet.
return memcpy(result, s1, len1);
. Obwohl es sich um eine Mikrooptimierung oder zumindest ein bisschen Code-Golf handelt, können solche potenziellen Verbesserungen bei grundlegenden Saitenoperationen aufgrund ihrer hohen Verwendung von Wert sein.stpcpy
, die einen Zeiger auf das Ende der ersten Zeichenfolge zurückgibt:strcpy(stpcpy(result, s1), s2);
quelle
David Heffernan erklärte das Problem in seiner Antwort, und ich schrieb den verbesserten Code. Siehe unten.
Eine generische Funktion
Wir können eine nützliche Variadic-Funktion schreiben, um eine beliebige Anzahl von Zeichenfolgen zu verketten:
Verwendung
Ausgabe:
Aufräumen
Beachten Sie, dass Sie den zugewiesenen Speicher freigeben sollten, wenn er nicht mehr benötigt wird, um Speicherlecks zu vermeiden:
quelle
int len
->size_t len
alssize_t
den richtigen Typ für "Größen" -Code. Auch// room for NULL
->// room for null character
NULL
impliziert den Nullzeiger.Ich gehe davon aus, dass Sie es für einmalige Dinge brauchen. Ich gehe davon aus, dass Sie ein PC-Entwickler sind.
Benutze den Stapel, Luke. Verwenden Sie es überall. Verwenden Sie malloc / free niemals für kleine Zuweisungen .
Wenn 10 KB pro Zeichenfolge nicht ausreichen, fügen Sie der Größe eine Null hinzu und kümmern Sie sich nicht darum. Sie geben ihren Stapelspeicher ohnehin am Ende des Bereichs frei.
quelle
snprintf(result, sizeof result, "%s %s %s", s1, s2, s3);
Sie sollten verwenden
strcat
oder besserstrncat
. Google it (das Schlüsselwort ist "verketten").quelle
strncat()
ist eine teuflisch schwierige Funktion, sie richtig zu verwenden. Welche Länge geben Sie schnell an, ohne das Handbuch zu lesenstrncat()
? Wenn Sie "die Länge des Puffers" sagten, haben Sie meinen Standpunkt nur gut demonstriert. Es verfügt über eine kontraintuitive Benutzeroberfläche, und wenn Sie über genügend Daten verfügen, um sie sicher zu verwenden, müssen Sie die Funktion erst gar nicht verwenden. Es gibt andere, schnellere und effizientere Alternativen (wiestrcpy()
odermemmove()
), die verwendet werden könnten stattdessen. Was auch immer die Frage ist, was ich verwenden soll,strncat()
ist nicht die Antwort.Sie können in C keine solchen Zeichenfolgenliterale hinzufügen. Sie müssen einen Puffer mit der Größe von Zeichenfolgenliteral eins + Zeichenfolgenliteral zwei + einem Byte für das Nullabschlusszeichen erstellen und die entsprechenden Literale in diesen Puffer kopieren und sicherstellen, dass er mit Null abgeschlossen ist . Oder Sie können Bibliotheksfunktionen wie verwenden
strcat
.quelle
Ohne GNU-Erweiterung:
Alternativ mit GNU-Erweiterung:
Weitere Informationen finden Sie unter malloc , free und asprintf .
quelle
quelle
Strings verketten
Das Verketten von zwei beliebigen Zeichenfolgen in C kann auf mindestens drei Arten erfolgen:
1) Durch Kopieren von Zeichenfolge 2 an das Ende von Zeichenfolge 1
2) Durch Kopieren von String 1 und String 2 in String 3
3) Mit der Funktion strcat ()
quelle
In C haben Sie als generisches erstklassiges Objekt nicht wirklich Zeichenfolgen. Sie müssen sie als Arrays von Zeichen verwalten, was bedeutet, dass Sie festlegen müssen, wie Sie Ihre Arrays verwalten möchten. Eine Möglichkeit sind normale Variablen, z. B. auf dem Stapel. Eine andere Möglichkeit besteht darin, sie mithilfe von dynamisch zuzuweisen
malloc
.Sobald Sie dies sortiert haben, können Sie den Inhalt eines Arrays in ein anderes kopieren, um zwei Zeichenfolgen mit
strcpy
oder zu verkettenstrcat
.Allerdings hat C das Konzept von "String-Literalen", die zur Kompilierungszeit bekannte Strings sind. Bei Verwendung handelt es sich um ein Zeichenarray, das im Nur-Lese-Speicher abgelegt wird. Es ist jedoch möglich, zwei Zeichenfolgenliterale zu verketten, indem Sie sie wie in nebeneinander schreiben
"foo" "bar"
, wodurch das Zeichenfolgenliteral "foobar" erstellt wird.quelle
mit memcpy
quelle