Wie kann ich ein einzelnes Zeichen an eine Zeichenfolge in C anhängen?
d.h.
char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */
Um in C ein Zeichen an eine Zeichenkette anzuhängen, müssen Sie zunächst sicherstellen, dass der Speicherpuffer, der die Zeichenkette enthält, groß genug ist, um ein zusätzliches Zeichen aufnehmen zu können. In Ihrem Beispielprogramm müssten Sie einen neuen, zusätzlichen Speicherblock zuweisen, da die angegebene Zeichenkette nicht geändert werden kann.
Hier's ein Beispiel:
#include <stdlib.h>
int main()
{
char *str = "blablabla";
char c = 'H';
size_t len = strlen(str);
char *str2 = malloc(len + 1 + 1 ); /* one for extra char, one for trailing zero */
strcpy(str2, str);
str2[len] = c;
str2[len + 1] = '\0';
printf( "%s\n", str2 ); /* prints "blablablaH" */
free( str2 );
}
Zuerst verwenden Sie malloc
, um ein neues Stück Speicher zuzuweisen, das groß genug ist, um alle Zeichen der Eingabezeichenkette, das zusätzliche Zeichen zum Anhängen - und die abschließende Null - unterzubringen. Rufen Sie dann strcpy
auf, um die Eingabezeichenfolge in den neuen Puffer zu kopieren. Schließlich ändern Sie die letzten beiden Bytes im neuen Puffer, um das hinzuzufügende Zeichen und die abschließende Null anzufügen.
char* str = "blablabla";
Diese Zeichenfolge sollte nicht verändert werden. Sie befindet sich in einem durch die Implementierung definierten schreibgeschützten Bereich. Ihre Änderung führt zu Undefiniertem Verhalten.
Sie benötigen ein char-Array und kein String-Literal.
Gut gelesen: Was ist der Unterschied zwischen char a[] = "string"; und char *p = "string";
Ich glaube nicht, dass man einen String so in C deklarieren kann. Das darf man nur für const char und natürlich kann man ein const char nicht verändern, da es const ist.
Sie können ein dynamisches char-Array verwenden, aber Sie müssen sich um die Neuzuweisung kümmern.
EDIT: In der Tat kompiliert diese Syntax korrekt. Dennoch sollte man nicht ändern, worauf str zeigt, wenn es so initialisiert ist, wie Sie es tun (von string literal)