C Anhängen an char *

7

Ich versuche also ein char an ein char* anzuhängen.

Zum Beispiel habe ich char *word = " "; Ich habe auch char ch = 'x';

Ich mache append(word, ch); Mit dieser Methode ..

%Vor%

Es gibt mir einen Segmentierungsfehler und ich verstehe, warum ich annehme. Weil s[len] außerhalb der Grenzen liegt. Wie kann ich es so machen, dass es funktioniert? Ich muss auch die char* viel löschen, wenn ich etwas wie char word [500] verwenden möchte; Wie würde ich das klarstellen, sobald es einige Zeichen angehängt hat? Wäre die strlen immer 500 ? Vielen Dank im Voraus.

    
Man Person 17.10.2012, 16:53
quelle

5 Antworten

10

Typische C-Praxis wäre wie folgt:

%Vor%

Beim Übergeben einer Funktion hat ein Array zum Ändern der Funktion keine Ahnung, wie viel Platz es zur Kompilierzeit hat. Übliche Übung in C besteht darin, auch die Länge des Arrays zu übergeben, und die Funktion wird dieser Grenze vertrauen und scheitern, wenn sie ihre Arbeit in dem Raum, den sie hat, nicht ausführen kann. Eine weitere Option ist das Neuzuordnen und Zurückgeben des neuen Arrays. Sie müssten char* oder char** als Eingabe zurückgeben, aber Sie müssen sorgfältig überlegen, wie Sie in dieser Situation den Heapspeicher verwalten. Aber ohne Neuzuweisung, ja, Ihre Funktion muss irgendwie fehlschlagen, wenn sie angefügt werden soll, wenn kein Platz mehr übrig ist, liegt es an Ihnen, wie Sie scheitern können.

    
djechlin 17.10.2012, 16:56
quelle
5

Es ist schwierig, einen String in C anzufügen. Versuchen Sie Folgendes:

%Vor%

Vergessen Sie nicht, die zurückgegebene Zeichenfolge zu entfernen, wenn Sie damit fertig sind.

FYI: Es segregiert wahrscheinlich, weil die Zeichenfolge, die Sie übergeben, im schreibgeschützten Speicher gespeichert ist. Aber du hast recht, du schreibst auch vom Ende ab (das [len+1] schreibt, nicht das [len] eins).

    
Keith Randall 17.10.2012 16:57
quelle
3

Wenn du vorbeikommst

%Vor%

es wird abstürzen, weil foo normalerweise in readonly Speicher gelegt wird. Selbst wenn es nicht ist, wird es wahrscheinlich etwas Schlechtes überschreiben! In diesem Fall sollte der Compiler, wenn er so ist, Sie vor der Konvertierung von const char * zu char * warnen, was ein Hinweis wäre.

    
Julian 17.10.2012 16:55
quelle
0

Ja, die Annahme, die Sie getroffen haben, ist - fast - korrekt - der Absturz könnte darauf zurückzuführen sein, dass Sie versuchen, über die Grenzen der Zeichenfolge hinaus zu schreiben (tatsächlich ist s[strlen(s) + 1] außerhalb der Grenzen, weil s[strlen(s)] immer noch ein ist) gültiger Ort - dort wird das abschließende NUL-Byte gespeichert. Sie können jedoch auch kein Zeichenfolgenliteral ändern, da es sich normalerweise in einem schreibgeschützten Teil des Prozessspeichers befindet. Diese beiden Aktionen führen zum Aufruf von undefiniertem Verhalten, das möglicherweise abstürzen kann. Sie können dieses Problem lösen, indem Sie die Zeichenfolge in einen dynamisch zugewiesenen Speicher kopieren und dann die Kopie ändern. Außerdem sollten Sie const char * im Argument Ihrer Funktion verwenden, weil char * vorschlägt, dass schreibgeschützte Zeichenfolgen nicht übergeben werden können.

%Vor%

Vergessen Sie auch nicht free() die zurückgegebene Zeichenfolge, wenn sie nicht mehr benötigt wird.

    
user529758 17.10.2012 17:01
quelle
0

Sie können nicht wirklich sicher an eine beliebige Zeichenkette anhängen, weil zum einen String-Konstanten dazu neigen, im Nur-Lese-Speicher zu sein. Wenn Sie also versuchen, in sie zu schreiben, führt dies wahrscheinlich zu einem Segmentierungsfehler garantiere, dass, wenn sie dir einen Puffer übergeben haben, den du nicht über das Ende davon geschossen hast.

Insbesondere, wenn Sie das tun     char x [500];

es gibt keine Garantie, dass strlen (x) Ihnen 500 zurückgibt. Es gibt Ihnen zurück, wie viele Zeichen es vom Start von x vorwärts zählen muss, bevor es eine Null erreicht. Es könnte Ihnen 0, 1 ... 500, 501 ... zurückgeben, abhängig davon, was in x ist.

Wirklich Ihre einzigen Optionen sind, Append mit der Größe des Puffers aufzurufen, an den Sie anhängen (damit Sie etwas passendes tun können, wenn der Puffer voll ist), oder append einen neuen Puffer bei jedem Aufruf zu reservieren, in In diesem Fall müssen Sie natürlich den Puffer wieder freigeben.

    
Tom Tanner 17.10.2012 17:02
quelle