einzelnes Zeichen aus char* (Array) ändern
-
ich hab nen string als char*
char* str1 = "teststr";
Wie kann ich ein einzelnes Zeichen darin ändern?
Danke!!!
-
Wie bei jedem andern Array auch...
str1[zeichen] = 'X';
-
char* str1 = "teststr";
ist ein stringliteral, das darfst du nicht verändern.
du kannst aber eine kopie davon erstellen und die verändern:char* str = "blabla"; char kopie[7]; std::strcpy(kopie,str); kopie[2] = 'g';
oder besser : nimm std::string !
-
phw schrieb:
char* str1 = "teststr";
ist ein stringliteral, das darfst du nicht verändern.
du kannst aber eine kopie davon erstellen und die verändern:char* str = "blabla"; char kopie[7]; std::strcpy(kopie,str); kopie[2] = 'g';
oder besser : nimm std::string !
Ich kann dir nicht folgen, denn char * enspricht char[].
Außerdem funktionert folgender Code einwandfrei:char * bla = "Baum"; bla[0] = 'S'; cout << bla;
PS: Man kann sogar solche verrückten Sachen machen: Der Compiler erzeugt einfach ein temporäres Objekt:
cout << &("Baum"[0] = 'S');
-
FireFlow schrieb:
Ich kann dir nicht folgen, denn char * enspricht char[].
Nein, dem ist nicht so.
FireFlow schrieb:
Außerdem funktionert folgender Code einwandfrei:
char * bla = "Baum"; bla[0] = 'S'; cout << bla;
Nur weil der Code bei dir funktioniert, heisst das noch lange nicht, dass er korrekt ist. Du darfst String Literale nunmal nicht ändern. Korrekterweise solltest du es wie folgt abändern
char bla[] = "Baum"; bla[0] = 'S'; cout << bla;
Oder wie schon erwähnt, std::string benutzen.
-
Die Zeile
char * bla = "Baum";
allein ist schon falsch. "Baum" ist ein String-Literal und als solches konstant. Richtig wäre
char const *bla = "Baum";
Ich ärger mich jedes mal wieder, dass Compiler das einfach so, und im Zweifel sogar noch ohne Warnung akzeptieren.
-
FireFlow schrieb:
Der Compiler erzeugt einfach ein temporäres Objekt:
cout << &("Baum"[0] = 'S');
Und eben das ist nicht garantiert. "Baum" kann statisch sein und selbst in schreibgeschütztem Speicher liegen.
-
Hmmm ihr habt wohl Recht *schäm*
Ich find es aber sehr komisch dass das alles im BCB funktioniert und mir MVC AccessViolations um die Ohren haut. Ein Hoch auf den Standard.
-
FireFlow schrieb:
Hmmm ihr habt wohl Recht *schäm*
Ich find es aber sehr komisch dass das alles im BCB funktioniert und mir MVC AccessViolations um die Ohren haut. Ein Hoch auf den Standard.Ja das ist ein Defekt im Standard. Glaub ich wurde noch aus C-Zeiten geerbt. Das Problem ist, dass ein Stringliteral eigentlich einen konstanten Zeiger zurückgeben sollte. Irgendwie finde ich es Schade, dass meines Wissen nach kein Compiler einen Schalter bereitstellt um ihn zu beheben (und allerdings auch mit bestehendem Code zu brechen).
-
Ben04 schrieb:
FireFlow schrieb:
Hmmm ihr habt wohl Recht *schäm*
Ich find es aber sehr komisch dass das alles im BCB funktioniert und mir MVC AccessViolations um die Ohren haut. Ein Hoch auf den Standard.Ja das ist ein Defekt im Standard.
Ein Defekt ist das nicht. Nur eine (ärgerliche) Rückwärtskompatiblitätsgeschichte, die btw. als deprecated eingestuft ist.
-
char* frage schrieb:
ich hab nen string als char*
char* str1 = "teststr";
Wie kann ich ein einzelnes Zeichen darin ändern?
Danke!!!
du kannst auch
char str1[8]="teststr";
schreiben. dann wird ein normales char-array deklariert und mit dem literal initalisiert. noch einfacher gehts mit
char str1[]="teststr";
hier bestimmt der compiler die array-größe automatisch. das geht übrigens mit allen arrays.
ob daß das ändern von string-literalen geht, hängt vom betriebssystem ab. unter linux würde ein programm, das versucht, ein string-literal zu schreiben, dank speicherschutz beendet (wenn nicht bestimmte compiler-optionen verwendet werden, die das doch erlauben). unter windows werden string-literale im normalen speicher untergebracht. da kann man sie ungestraft schreiben.
-
Konfusius schrieb:
ob daß das ändern von string-literalen geht, hängt vom betriebssystem ab. unter linux würde ein programm, das versucht, ein string-literal zu schreiben, dank speicherschutz beendet (wenn nicht bestimmte compiler-optionen verwendet werden, die das doch erlauben). unter windows werden string-literale im normalen speicher untergebracht. da kann man sie ungestraft schreiben.
Seltsam, bei mir wird das Programm beim Beschreiben eines String Literals auch beendet (bzw 'ne Exception geworfen) und ich hab kein Linux. Du solltest über deine Aussage also nochmal nachdenken.
Es macht keinen Sinn sich den Kopf zu zerbrechen, wo das Schreiben von String Literalen funktioniert und wo nicht. Lass es einfach bleiben und gut ist.