Wie hänge ich ein einzelnes Zeichen an eine Zeichenfolge in C an?
dh
char* str = "blablabla";
char c="H";
str_append(str,c); /* blablablaH */
Wie hänge ich ein einzelnes Zeichen an eine Zeichenfolge in C an?
dh
char* str = "blablabla";
char c="H";
str_append(str,c); /* blablablaH */
Friedrich Rabe
Um in C ein Zeichen an einen String anzuhängen, müssen Sie zunächst sicherstellen, dass der Speicherpuffer, der den String enthält, groß genug ist, um ein zusätzliches Zeichen aufzunehmen. In Ihrem Beispielprogramm müssten Sie einen neuen, zusätzlichen Speicherblock zuweisen, da die angegebene Literalzeichenfolge nicht geändert werden kann.
Hier ist ein Beispiel:
#include <stdlib.h>
int main()
{
char *str = "blablabla";
char c="H";
size_t len = strlen(str);
/* one for extra char, one for trailing zero */
char *str2 = malloc(len + 1 + 1);
strcpy(str2, str);
str2[len] = c;
str2[len + 1] = '\0';
printf("%s\n", str2); /* prints "blablablaH" */
free(str2);
}
Erste Benutzung malloc
um einen neuen Speicherplatz zuzuweisen, der groß genug ist, um alle Zeichen der Eingabezeichenfolge, das anzuhängende zusätzliche Zeichen und die abschließende Null aufzunehmen. Dann ruf an strcpy
um die Eingabezeichenfolge in den neuen Puffer zu kopieren. Ändern Sie schließlich die letzten beiden Bytes im neuen Puffer, um das hinzuzufügende Zeichen sowie die nachgestellte Null anzuheften.
Der Kommentar zur Verwendung von sizeof ist falsch. sizeof str
ist entweder 4 oder 8, je nachdem, ob Sie 32- oder 64-Bit-Code kompilieren.
– JeremyP
21. Mai 2014 um 2:20 Uhr
Verwenden Sie außerdem immer einen Formatbezeichner in printf. Stellen Sie sich vor, wenn str
enthalten a %s
char-Sequenz darin.
– JeremyP
21. Mai 2014 um 2:21 Uhr
@JeremyP Das sizeof
Kommentar ist in der Tat ungenau. Ich meinte, dass Sie anrufen können sizeof("blablablah")
, werde ich den Kommentar einfach ganz entfernen, da der Compiler möglicherweise schlau genug ist, um zu bemerken, dass er den Aufruf konstant falten kann. Was den Formatbezeichner betrifft – Sie haben natürlich Recht, ein sehr peinlicher Fehler. Ich werde meine Antwort aktualisieren.
– Frerich Raabe
21. Mai 2014 um 7:01 Uhr
Alok Speichern
char* str = "blablabla";
Sie sollten diese Zeichenfolge überhaupt nicht ändern. Es befindet sich in einer implementierungsdefinierten Nur-Lese-Region. Das Ändern verursacht Undefiniertes Verhalten.
Sie benötigen ein Char-Array, kein String-Literal.
Gute Lektüre:
Was ist der Unterschied zwischen char a[] = “Zeichenfolge”; und char *p = “string”;
neu
Das Originalplakat wollte nicht schreiben:
char* str = "blablabla";
aber
char str[128] = "blablabla";
Nun scheint das Hinzufügen eines einzelnen Zeichens effizienter zu sein als das Hinzufügen einer ganzen Zeichenfolge mit strcat. Wenn Sie den Strcat-Weg gehen, könnten Sie:
char tmpstr[2];
tmpstr[0] = c;
tmpstr[1] = 0;
strcat (str, tmpstr);
Sie können aber auch ganz einfach Ihre eigene Funktion schreiben (wie es mehrere vor mir getan haben):
void strcat_c (char *str, char c)
{
for (;*str;str++); // note the terminating semicolon here.
*str++ = c;
*str++ = 0;
}
Lay González
Wenn Linux Ihr Anliegen ist, können Sie am einfachsten zwei Zeichenfolgen anhängen:
char * append(char * string1, char * string2)
{
char * result = NULL;
asprintf(&result, "%s%s", string1, string2);
return result;
}
Dies funktioniert nicht mit MS Visual C.
Notiz: Sie müssen free()
die Erinnerung zurückgegeben von asprintf()
Ivaylo Strandjev
Ich glaube nicht, dass Sie eine solche Zeichenfolge in c deklarieren können. Sie können das nur für const char* tun und natürlich können Sie ein const char * nicht ändern, da es const ist.
Sie können ein dynamisches Zeichenarray verwenden, müssen sich jedoch um die Neuzuweisung kümmern.
BEARBEITEN: Tatsächlich wird diese Syntax korrekt kompiliert. Trotzdem können Sie nicht ändern, worauf str zeigt, wenn es so initialisiert wird, wie Sie es tun (aus dem String-Literal).
char *ptr = "string"
ist vollkommen gültig in C.
– Alok Speichern
23. April 2012 um 11:37 Uhr
@Als – ja das stimmt. Ich dachte, es ist nicht, aber es scheint in Ordnung zu sein. Sie können das Array jedoch immer noch nicht ändern.
– Ivaylo Strandjev
23. April 2012 um 11:38 Uhr
Ja, Sie können die nicht ändern String-Literal Es ist zunächst kein Array.
– Alok Speichern
23. April 2012 um 11:39 Uhr
@Als wieder stimme ich zu – es ist wörtlich 🙂
– Ivaylo Strandjev
23. April 2012 um 11:42 Uhr
@AlokSave String-Literale sind Arrays.
– Melpomen
11. Dezember 2016 um 8:05 Uhr
Benutzer3574984
Erstellen Sie eine neue Zeichenfolge (Zeichenfolge + Zeichen)
#include <stdio.h>
#include <stdlib.h>
#define ERR_MESSAGE__NO_MEM "Not enough memory!"
#define allocator(element, type) _allocator(element, sizeof(type))
/** Allocator function (safe alloc) */
void *_allocator(size_t element, size_t typeSize)
{
void *ptr = NULL;
/* check alloc */
if( (ptr = calloc(element, typeSize)) == NULL)
{printf(ERR_MESSAGE__NO_MEM); exit(1);}
/* return pointer */
return ptr;
}
/** Append function (safe mode) */
char *append(const char *input, const char c)
{
char *newString, *ptr;
/* alloc */
newString = allocator((strlen(input) + 2), char);
/* Copy old string in new (with pointer) */
ptr = newString;
for(; *input; input++) {*ptr = *input; ptr++;}
/* Copy char at end */
*ptr = c;
/* return new string (for dealloc use free().) */
return newString;
}
/** Program main */
int main (int argc, const char *argv[])
{
char *input = "Ciao Mondo"; // i am italian :), this is "Hello World"
char c="!";
char *newString;
newString = append(input, c);
printf("%s\n",newString);
/* dealloc */
free(newString);
newString = NULL;
exit(0);
}
0 1 2 3 4 5 6 7 8 9 10 11
newString is [C] [i] [a] [o] [\32] [M] [o] [n] [d] [o] [!] [\0]
Ändern Sie nicht die Array-Größe ([len +1]
etc.) ohne genaue Größe zu kennen, kann es andere Daten beschädigen. alloc
ein Array mit der neuen Größe erstellen und stattdessen die alten Daten einfügen, denken Sie daran, dass für ein char-Array der letzte Wert sein muss \0
; calloc()
setzt alle Werte auf \0
das ist ausgezeichnet für char
Arrays.
Ich hoffe das hilft.
char *ptr = "string"
ist vollkommen gültig in C.
– Alok Speichern
23. April 2012 um 11:37 Uhr
@Als – ja das stimmt. Ich dachte, es ist nicht, aber es scheint in Ordnung zu sein. Sie können das Array jedoch immer noch nicht ändern.
– Ivaylo Strandjev
23. April 2012 um 11:38 Uhr
Ja, Sie können die nicht ändern String-Literal Es ist zunächst kein Array.
– Alok Speichern
23. April 2012 um 11:39 Uhr
@Als wieder stimme ich zu – es ist wörtlich 🙂
– Ivaylo Strandjev
23. April 2012 um 11:42 Uhr
@AlokSave String-Literale sind Arrays.
– Melpomen
11. Dezember 2016 um 8:05 Uhr
aib
C hat per se keine Strings – was Sie haben, ist ein char-Zeiger, der auf einen Nur-Lese-Speicher zeigt, der die Zeichen “blablabla\0” enthält. Um dort ein Zeichen anzuhängen, benötigen Sie a) beschreibbaren Speicher und b) genügend Platz für den String in seiner neuen Form. Das String-Literal “blablabla\0” hat beides nicht.
Die Lösungen sind:
1) Verwenden malloc()
et al. Speicher dynamisch zuzuweisen. (Nicht vergessen free()
danach.)
2) Verwenden Sie ein Zeichenarray.
Wenn Sie mit Zeichenfolgen arbeiten, sollten Sie die Verwendung von in Betracht ziehen strn*
Varianten der str*
Funktionen — sie helfen Ihnen, innerhalb der Speichergrenzen zu bleiben.
Aber niemals verwenden strncpy
. Es ist keine String-Funktion (trotz ihres Namens) und verursacht nur Probleme.
– Melpomen
11. Dezember 2016 um 8:04 Uhr
Unter der Voraussetzung, dass Ihre Definition eines Strings in Zeile 1 ein char-Array mit genügend Speicher sein muss (wie in den Antworten beschrieben), versuchen Sie es mit strncat(str,&c,1); für das eigentliche Anhängen.
– Chris Johnson
23. April 2012 um 11:49 Uhr