const char* verändern?



  • wenn ein const char* vorgegeben ist, werde ich doch net anfangen, das ding in ein string umzuwandeln. Ich weiß schließlich net, was man später damit machen will. 😉



  • ruhig_brauner schrieb:

    wenn ein const char* vorgegeben ist, werde ich doch net anfangen, das ding in ein string umzuwandeln. Ich weiß schließlich net, was man später damit machen will. 😉

    Kopf->Tisch
    Das war nicht gemeint.



  • Sone du solltest aufhören deinen Kopf gegen den Tisch oder deine Hand zu hauen und die zeit investieren um zu erklären, was du meinst. 😉

    Es ist ein kleiner Teil des Quelltextes schon vorgeschrieben, unter anderem die Deklaration von zwei const char* -Elementen. Dann noch zwei Funktionen ohne Parameterübergabe, die ich füllen soll. Dann noch einen kleinen Dialog ergänzen. Das war es im großen und ganzen.

    Ich hab dann halt mitbekommen, das man eigentlich keine const char*-Elemente ändern kann. Die Funktion löst das Problem, indem sie ein neues Element Erzeugt und nach Bearbeitung den alten Zeiger drauf umgelenkt. Schon hat sich das. Die Frage war nur, ob man sich das mit cast_const sparen kann.

    Wie wäre euer Ansatz?


  • Mod

    ruhig_brauner schrieb:

    Wie wäre euer Ansatz?

    Gib uns die genaue Aufgabenstellung, nicht bloß deine prosaische Interpretation. Hast du Code?

    P.S.: const_cast ist sicherlich nicht die Lösung, sondern ist grob falsch.



  • Wie gesagt, die poste ich aus paranoiden gründen net, aber an sich hab ich nur die Variablen und so umgenannt.

    Vorgabe:

    class Myclass
    {
       public
    
       ersetze_H_mit_h_(...)
       {
       ...
       }
    
    };
    
    int main()
    {
    const char* aendermich = "Hallo, hallo"
    
    // Ausgabe neuer und alter String
    }
    

    Augabe:
    - ersetze_H_mit_h_(...) soll alle "H"s mit "h"s im String aendermich ersetzen.
    - bei dem Kommentar // Ausgabe neuer und alter String soll der neue und der alte String ersetzt werden

    Da sind noch andere Aufgaben, die hab ich raus gestrichen. Ich hab jetzt alles wichtige von der Formulierung ähnlich gelassen, der Quelltext ist fast identisch, andere Namen...



  • std::string ersetze_h_mit_H(char const* str)
    {
        std::string result(str);
        std::replace(result.begin(), result.end(), 'h', 'H');
        return result;
    }
    
    int main()
    {
        const char* aendermich = "Hallo, hallo";
        std::string geaendert = ersetze_h_mit_H(aendermich);
    
        std::cout << "Alt: " << aendermich;
        std::cout << "\nNeu: " << geaendert << '\n';
    }
    

    Was ist an der Lösung inkorrekt? Wenn du Bock hast kannst du dir ja mit std::string::c_str einen const char* geben lassen ...



  • Nach dem was ich verstehe, soll ich "aendermich" verändern und keine neue Variable erzeugen. Ich nehme mal an mit std String-Objekten geht das auch, aber dann nimmt sich das sicher net mehr viel.

    Geht die Umwandlung von string in c-string schnell? In die andere richtung ja anscheinend schon. 😉


  • Mod

    ruhig_brauner schrieb:

    Nach dem was ich verstehe, soll ich "aendermich" verändern und keine neue Variable erzeugen.

    Wie kommst du zu diesem Verständnis. Wenn du hinterher die alte Zeichenkette auch noch mit ausgeben sollst, widerspricht dies dieser Interpretation.

    P.S.: Eine andere Herangehensweise wäre übrigens, ein "View"-Objekt zu erzeugen, welches gar keine Kopie der Zeichen macht, sondern on-demand eine veränderte Version der Zeichen gibt. Dies würde auch zu der gezeigten Signatur passen, eigentlich fast schon besser. Würde zu einer Firma passen, die starken Wert auf Design-Patterns und so legt.



  • Naja hab ja nur gesagt Dialog, hätte es vielleicht besser posten sollen...

    cout << aendermich;

    funktion(aendermich);
    cout << aendermich;



  • ruhig_brauner schrieb:

    cout << aendermich;

    funktion(aendermich);
    cout << aendermich;

    Solange aendermich auf ein String-Literal zeigt, ist deine die einzige richtige Lösung.



  • Aber jetzt mal aus reinem interesse (Und weil ich das so oder so irgendwann wissen muss^^)

    Wie macht man aus einem string-Objekt wieder ein char*-String?



  • ruhig_brauner schrieb:

    Wie macht man aus einem string-Objekt wieder ein char*-String?

    Einen char*-String kannst du daraus gar nicht mehr machen, höchstens durch kopieren mit string::copy().

    Aber du kannst ganz leicht einen Zeiger auf einen konstanten String bekommen ( char const* , bzw. const char* ): Durch string::c_str().



  • Na ok, das wäre zumindest eine elegantere Lösung gewesen. Schade. 😉



  • char *str = &mystring[0];
    


  • Bemerkung: Es ist nicht garantiert, dass str nullterminiert ist. Du musst vorher noch ein mystring.push_back(0) machen.



  • .


  • Mod

    Um mal zu zeigen, dass man nichts kopieren braucht, um die genannte Aufgabe zu erfüllen:

    #include <iostream>
    
    class CharReplacer
    {
      char from, to;
      const char* string;
    public:
      CharReplacer(char from, char to, const char* what): 
        from(from), to(to), string(what) {}
      friend std::ostream& operator<<(std::ostream& out, const CharReplacer& cr)
      {
        for (const char* it = cr.string; *it!=0; ++it)
          out << ((*it != cr.from) ? *it : cr.to);
        return out;
      }
    };
    
    int main()
    {
      const char* aendermich = "Hallo, hallo";
      std::cout << "Vorher: " << aendermich 
                << "\nNachher: " << CharReplacer('l', 'L', aendermich) 
                << '\n';
    }
    

    Ginge natürlich noch wesentlich schöner mit Templates und Iteratoren, aber die Vorlage des TE passt nicht dazu.


Anmelden zum Antworten