Einzelnes Zeichenelement einer Zeichenkette ersetzen C [duplicate]

Lesezeit: 2 Minuten

Benutzeravatar von user1163974
Benutzer1163974

Ich versuche, etwas wirklich Grundlegendes in C zu tun, aber ich bekomme immer wieder einen Segmentierungsfehler. Alles, was ich tun möchte, ist, einen Buchstaben eines Wortes durch einen anderen Buchstaben zu ersetzen. Ersetzen Sie in diesem Beispiel das l durch ein L. Kann mir jemand erklären, wo ich falsch gelaufen bin? Es sollte ein wirklich grundlegendes Problem sein, denke ich, ich habe nur keine Ahnung, warum es nicht funktioniert.

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
    char *string1;

    string1 = "hello";
    printf("string1 %s\n", string1);    

    printf("string1[2] %c\n", string1[2]);
    string1[2] = 'L';
    printf("string1 %s\n", string1);

    return 0;
}

Für meine Ausgabe bekomme ich

Zeichenfolge1 Hallo
Zeichenfolge1[2] l
Segmentierungsfehler

Danke!

  • String1 ist ein Zeiger auf den Nur-Lese-Speicher (in den meisten Systemen), da es ein konstanter Initialisierer ist. Sie können nicht in diese Zeichenfolge schreiben, ohne sie vorher zu kopieren.

    – gage

    16. April 2013 um 1:45 Uhr


string1 = "hello";
string1[2] = 'L';

Du kann String-Literale nicht ändern, es ist undefiniertes Verhalten. Versuche dies:

char string1[] = "hello";

Oder vielleicht:

char *string1;
string1 = malloc(6); /* hello + 0-terminator */
strcpy(string1, "hello");

/* Stuff. */

free(string1);

  • Nichts Großes, aber Sie können strdup(“hello”) anstelle eines Aufrufs von malloc und strcpy verwenden. strdup erledigt dies für Sie, es ist bequemer zu verwenden

    – Zoneur

    5. Februar 2012 um 13:32 Uhr

  • @Zoneur Yup, empfehle ich oft strdup aber es ist manchmal problematisch, weil es nicht Standard ist.

    – Cnicutar

    5. Februar 2012 um 13:33 Uhr

  • Wenn ich diesen Wert ändern möchte? “Hallo” bis “Helxo” funktioniert nicht

    Benutzer3402040

    10. Mai 2017 um 11:48 Uhr


char *string1;
string1 = "hello";

string1 zeigt auf ein Zeichenfolgenliteral, und Zeichenfolgenliterale können nicht geändert werden.

Was Sie tun können, ist ein Array mit den Elementen eines Zeichenfolgenliterals zu initialisieren.

char string1[] =  "hello";

die Elemente von string1 Array sind modifizierbar.

char *string1 = "hello";

Beim Ausführen des Codes befindet sich das Zeichenfolgenliteral in einem schreibgeschützten Abschnitt. Das Betriebssystem erlaubt dem Code nicht, diesen Speicherblock zu ändern, sodass Sie einen Seg-Fehler erhalten.

char string1[] = "hello";

Das Zeichenfolgenliteral wird beim Ausführen des Codes auf den Stapel geschoben.

 string1[2] = 'L';

Sie versuchen, ein Zeichenfolgenliteral zu ändern, das in C ein undefiniertes Verhalten ist. Verwenden Sie stattdessen string1[]="hello";
Der Segmentierungsfehler, den Sie erhalten, liegt daran, dass das Literal wahrscheinlich im Nur-Lese-Bereich des Speichers gespeichert ist und der Versuch, darauf zu schreiben, ein undefiniertes Verhalten erzeugt.

1437290cookie-checkEinzelnes Zeichenelement einer Zeichenkette ersetzen C [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy