C Anhängen von char zu char*
So, ich bin versucht, anfügen einer char
zu einem char*
.
Ich habe zum Beispiel char *word = " ";
Ich habe auch char ch = 'x';
Ich tun append(word, ch);
Mit dieser Methode..
void append(char* s, char c)
{
int len = strlen(s);
s[len] = c;
s[len+1] = '\0';
}
Gibt er mir "segmentation fault", und ich verstehe, warum nehme ich an. Da s[len]
ist out of bounds. Wie kann ich machen, damit es funktioniert? Ich muss klar die char*
eine Menge als auch, wenn ich so etwas wie char Wort[500]; Wie würde ich es klar, dass, wenn es hat einige Zeichen angehängt? Würde die strlen
es immer 500
? Vielen Dank im Voraus.
- "Weil s[len] ist out of bounds." <- Sehr gut erkannt für einen Anfänger!!! Herzlichen Glückwunsch. Jedoch, Sie haben noch eine andere Fehler - ein string-literal ist readonly, kann man nicht ändern, seinen Inhalt.
s[len + 1]
ist out of bounds.s[len]
ist das null-byte, die nicht gezähltstrlen
.- yep, technisch Recht. Ich sollte geschrieben haben
sizeof(s)
statt. - sollte nicht const Art der Zeichenfolge litteral trigger eine compiler-Warnung whan an die Funktion übergeben ?
- definitiv nicht, das ist wahrscheinlich 4 oder 8 und spiegelt die Größe des Zeigers.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Typischen C-Verfahren werden wie:
Beim übergeben einer Funktion ein array zu ändern, die Funktion hat keine Idee zur compile-Zeit, wie viel Platz es hat. Übliche Praxis in C ist auch an der Länge des Arrays und der Funktion dieses Vertrauen gebunden und scheitern, wenn es kann nicht seine Arbeit in den Raum, die es hat. Eine weitere option ist die Umverteilung und die Rückkehr der neuen array, würden Sie brauchen, um zurück
char*
oder nehmenchar**
als input, sondern Sie müssen denken Sie sorgfältig, wie die Verwaltung von heap-Speicher in dieser situation. Aber ohne Umverteilung, ja, Ihre Funktion muss irgendwie scheitern, wenn es um die Frage anfügen, wenn es keinen Raum nach Links, es ist für Sie für wie zu scheitern.Ist es schwer zum Anhängen an einen string in-place in C. Probieren Sie etwas wie dieses:
Werden sicher freigeben der string zurückgegeben wird, wenn Sie fertig mit ihm.
FYI: Es segfaults wahrscheinlich, weil der string, den Sie übergeben, gespeichert im nur-lese-Speicher. Aber du hast Recht, Sie sind auch schriftlich-off der Ende (der
[len+1]
schreiben, nicht die[len]
eine).Wenn Sie vorbei sind in
wird es Abstürzen, weil foo ist normalerweise setzen im readonly-Speicher. Auch wenn es nicht es wird etwas überschreiben schlecht wahrscheinlich!
In diesem Fall ist der compiler, wenn er die Art, sollten Sie warnen die Konvertierung von const char * nach char *, das wäre ein Anhaltspunkt.
Ja, die Annahme, die Sie gemacht ist - fast - richtig, der Absturz sein kann, weil Sie versuchen, zu schreiben, über die Grenzen der Zeichenfolge (eigentlich nur
s[strlen(s) + 1]
ist out of bounds, weils[strlen(s)]
noch einen gültigen Speicherort - der terminierenden NULL-byte ist dort gespeichert). Aber Sie können es auch nicht ändern, ein string-literal, weil es meist in einigen readonly Teil des Prozesses Speicher. Diese beiden Aktionen führen zum Aufruf der undefinierten Verhalten, die das potential haben, abzustürzen. Lösen können Sie dieses problem durch das kopieren des string in einen dynamisch zugewiesenen Speicher dann die Kopie ändern. Auch sollen Sie sich zu nutzenconst char *
im argument von Ihrer Funktion, weilchar *
deutet darauf hin, dass nur-lese-strings können nicht übergeben werden.Auch, vergessen Sie nicht zu
free()
die zurückgegebene Zeichenkette, wenn es nicht mehr benötigt.Kann man sich nicht wirklich sicher anfügen an eine beliebige Zeichenfolge sein, weil Erstens, string-Konstanten, meist in einem nur-lese-Speicher, so versuche zu schreiben, Sie ist wahrscheinlich in einem "segmentation fault", und zweitens, Sie haben keine Garantie, dass wenn Sie bestanden haben Sie einen Puffer, den Sie noch nicht geschossen über das Ende.
Insbesondere, wenn Sie tun
char x[500];
es gibt keine Garantie, dass strlen(x) kehren Sie 500. Es wird Sie wieder, wie viele Zeichen es zählen vorwärts von dem start von x, bevor es erreicht den Wert null. Es könnte Sie wieder 0, 1 ... 500, 501 ..., je nachdem, was ist in x.
Wirklich Ihre einzigen Optionen sind zu nennen Anhängen, das die Größe des Puffers, der Sie Anhängen (so können Sie etwas tun angemessen, wenn der Puffer voll ist), oder anfügen reservieren einer neuen Puffer jedes mal, wenn es aufgerufen wird, in welchem Fall Sie benötigen, um die Puffer natürlich auch wieder.