char zeiger ändern



  • Hallo,
    ich probiere gerade ein Beispiel aus, dass ich in einem Buch(Visual C++ 6) gesehen hab.
    Dort wird ein char Zeiger deklariert und initialisiert mit "Hallo Welt" (Ach nee;-))
    Es geht darum ,den ersten Buchstaben zu ändern. Im Beispiel geht das so:
    char *MyString = "Hallo Welt";
    char *CharPointer;

    CharPointer = MyString;
    *CharPointer = 'K';

    Laut Buch soll das funktionieren, aber mein Compiler Visual C++ 6 meldet eine Schutzverletzung. Davon ist im Buch keine Rede. Weiss jemand, warum das nicht klappt? Jemand hat mir erzählt, der gleiche code läuft bei ihm unter Borlands Compiler.
    Danke 🙂

    Grüße

    paloncino



  • Dein Compiler machts aber besser 😉

    Folgende Sache:
    Wenn du einen char* String erstellst und ihm gleich mit "Text" einen Text zuweist, ist es Laut Standard so, dass der Text als Konstant (also Read-Only) anzusehen ist.

    Deswegen kriegst du Ärger, wenn du deinem String ein K zuweisen willst.

    Eine Lösung wär z.B.

    char String[256] = "Hallo, Welt!";
    

    Jetzt ist es kein Stringliteral mehr, sondern eine Arrayinitialisierung.



  • Hallo,
    danke für deine Antwort. Du meinst also, das ist ein konstantes Literal. Das habe ich verstanden. wie gesagt, ich bin dabei, zu lernen. Diese Geschichte mit Strings hab ich noch nicht durchgenommen. Soviel ich weiss, behandelt C++ Strings als ein Array, also immer mit char * Stringvariable. Es gibt aber doch eine Klasse String,nicht wahr? Ist das eine Klasse der MFC? Es tauchte auch schon der Begriff STL auf. Worum geht es da? Muss ich, wenn ich die String klasse benütze(soweit ich recht habe mit meiner These s.o) irgendeine Header einbinden? Und wo ich schon mal dabei bin, zum Thema Header Dateien. Ich lese unterschiedliche Vorgehensweisen. Einmla steht da, es wird ausschließlich deklariert, also sozusagen nur der Prototyp einer Funktion z.B, dann wieder lese ich, es würde auch definiert, also wäre auch der eigentliche Code einer Funktion in der Header Datei. Trifft beides zu?
    Vielleicht kannst du mir helfen. Entschuldige den Wust an Fragen, ich denke mich halt gerade rein in die Sprache. Vielleicht muss ich nicht für jede Kleinigkeit ein neues Thema aufmachen.
    Grüße

    paloncino



  • paloncino schrieb:

    Du meinst also, das ist ein konstantes Literal.

    Naja, es ist ein Literal, und das impliziert automatisch, dass es konstant, also read-only ist.

    paloncino schrieb:

    Es gibt aber doch eine Klasse String,nicht wahr?

    Das stimmt, du meinst wahrscheinlich std::string.

    paloncino schrieb:

    Ist das eine Klasse der MFC?

    Nein. MFC hat auch eine String Klasse, CString. Hat aber nix mit Standard C++ zu tun.

    paloncino schrieb:

    Es tauchte auch schon der Begriff STL auf. Worum geht es da?

    STL steht für Standard Template Library. Das ist eine template-basierte Bibliothek, die in den C++ Standard aufgenommen und entsprechend spezifiziert wurde. Sie bietet verschiedene Container (aber auch mehr), die einem das Arbeiten erleichtern sollen. Die meisten modernen Compiler bringen eine entsprechende STL Implementation mit, es gibt aber auch frei verfügbare, zB stlport.

    paloncino schrieb:

    Muss ich, wenn ich die String klasse benütze(soweit ich recht habe mit meiner These s.o) irgendeine Header einbinden?

    Ja, musst du. Siehe dazu entsprechende Doku.

    paloncino schrieb:

    Und wo ich schon mal dabei bin, zum Thema Header Dateien. Ich lese unterschiedliche Vorgehensweisen. Einmla steht da, es wird ausschließlich deklariert, also sozusagen nur der Prototyp einer Funktion z.B, dann wieder lese ich, es würde auch definiert, also wäre auch der eigentliche Code einer Funktion in der Header Datei. Trifft beides zu?

    Jein. Normalerweise trennt man so, dass die Funktionsdeklarationen in den Header, und die Definition in die ÜE kommen. Es gibt aber Ausnahmen, die das nicht allgemein gültig machen.
    Sehr kurze Funktionen eignen sich zB gut für Inlining, deshalb wird man sowas recht häufig direkt in der Klassendefinition implementiert sehen. Ein weiterer Punkt sind Templates. Da kaum ein Compiler das Schlüsselwort export unterstützt, wird man diese Funktionen auch in der Header definieren.


Anmelden zum Antworten