const char* verändern?
-
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 werdenDa 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.

-
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.
-
.
-
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.