const char* verändern?
-
const char*soll man nie aufchar*casten. Denn sie (=die Pointer) können auf Read Only Memory zeigen. Darauf darfst du kein delete machen. Also lass die Finger weg von const_cast.Wenn du
const char* beispiel="bla bla bla";hast, kannst du Beispiel nicht löschen und brauchst es nicht tun. Da gammelt nichts im Speicher rum.Also musst du ihn beschreibbar machen. Das geht zB mit
strncpy. Sobald du diesenchar*hast, kannst du ihn verändern und musst ihn wieder löschen.Musst du wirklich
beispielumändern, dann kann das so aussehen:const char* beispiel="bla bla bla"; int n = strlen(beispiel)+1; char *beschreibbar = malloc(n); strncpy(beschreibbar, beispiel, n); aendere(beschreibbar); // ändere nimmt einen char* entgegen beispiel = beschreibbar; // höhö free(breschreibbar);So jedenfalls in C. In C++ würde man strings verwenden und dann erübrigt sich das Problem.
-
Das macht ja im grunde das selbe wie mein blödsinn. Nur dass du malloc und ich new benutze. Also wenn man eine Deklaration mit Initialisierung hat, was
const char* beispiel = "bla bla";ja quasi ist. Dann dümpelt das net im Speicher rum, nachdem der Zeiger umgelenkt wurde?
-
ruhig_brauner schrieb:
Dann dümpelt das net im Speicher rum, nachdem der Zeiger umgelenkt wurde?
Schon, aber nicht so wie du meinst. Das ist ein fester Teil deiner Executable und der Zeiger zeigt eben auf eine bestimmte Stelle in deinem Programmcode. Den eigentlichen Inhalt dieser Speicherstelle kannst du (in der Regel) nicht verändern und das ist auch gut so und ganz normal und du brauchst dir deswegen keine Sorgen zu machen.
Mehr Sorgen machen würde ich mir wegen der Aufgabe, ich kann mir eigentlich nur vorstellen, dass du die falsch verstanden hast. Ansonsten würde das nämlich heißen, dass der Aufgabensteller keine Ahnung hat oder euch komische Sachen beibringt. Da wir alle wissen, wie extrem kompetent in C++ Lehrer sind, die vor 40 Jahren mal Basic gelernt haben, kann ich mir das wirklich nicht vorstellen
.
-
Das ist ne Aufgabe für nen Einstellungstest. Bewerbung ist schon durch, dann halt ein kleiner Test zum Thema C++. Bin Student im ersten Semester, will da als Werksstudent ein wenig Praxisluft schnuppern und ein wenig mehr meine C/++ Kenntnisse fordern, in der HS sind wir momentan gerade mal bei simplen Konsolen-Anwendungen, bei denen das komplexeste eine Schleife ist.

In dem Vorgegebenen Code ist eben so eine Zeile:
"const char *bla = "quarks und Co.";wobei char* bla das selbe ist wie char *bla, nach meinem Wissen.
Eine Aufgabe ist quasi: Die Funktion ... soll in dem String "bla" alle "u" durch "U" ersetzen (u -> U). (Blödes BEispiel aber ich weiß net, ob ich so einfach die Aufgabe und die Firma hier posten sollte...
)
-
Der wichtigste Punkt bei dieser Sache mit den Zeichenketten ist eben das UB.
Das Programm crasht dann AFAIR in den meisten Fällen nicht, aber was eigentlich passiert ist eben nie garantiert.Eine Aufgabe ist quasi: Die Funktion ... soll in dem String "bla" alle "u" durch "U" ersetzen (u -> U).
Bitte sag deiner Firma, das Assessment Center soll sich bessere Aufgaben ausdenken. Die Aufgabe ist bescheuert formuliert und auch komisch, denn die Funktion ... sollte nicht einfach einen bestimmten String bearbeiten (können), sondern wenigstens alle.
Funktionen müssen schön allgemein gehalten werden.
-
Das ist meine Formulierung

Die Funtktion kann alle Strings, die ihr übergeben werden (const char*) bearbeiten. Mir fällt nur gerade ein, dass kein delete[]-Befehl drin ist. Wenn man (nicht in der Aufgabe enthalten) die Funktion über einen mit new angeforderten Speicherplatz laufen lässt, gibt es n Memory-Leak, oder?

-
Sone schrieb:
In C++ gehen beide Schreibweisen, da gibt es keinen Unterschied. In C ging nur eine.
Nein, das geht auch in C beides.
-
Die Funtktion kann alle Strings, die ihr übergeben werden (const char*) bearbeiten.
facepalm
Nein, dieser Zeiger impliziert doch dass der String auf den er zeigt nicht verändert werden darf/soll!Mir fällt nur gerade ein, dass kein delete[]-Befehl drin ist. Wenn man (nicht in der Aufgabe enthalten) die Funktion über einen mit new angeforderten Speicherplatz laufen lässt, gibt es n Memory-Leak, oder?
s. o., den Speicherplatz freizugeben verändert den String insofern dass er jeden Moment überschrieben werden kann. Das darf nicht geschehen. s. o.
-
SeppJ schrieb:
Sone schrieb:
In C++ gehen beide Schreibweisen, da gibt es keinen Unterschied. In C ging nur eine.
Nein, das geht auch in C beides.
Wirklich? In C++ von A bis Z steht AFAIK was anderes. Ich krams mal raus, aber ich hab mich bestimmt nur falsch erinnert

Edit: Jup, er sagt nur, dass die eine in C sehr oft genutzt wurde.
-
Willst du hier ernsthaft JW als Quelle angeben? Das ist schon fast ein Beweis, dass es nicht so ist, wenn er das so schreibt.
-
Also hab das mal probiert, nachdem ich den String (const char*) mit der funktion geändert habe kann ich den neuen String, der ausgegeben halt anders aussieht, wieder verändern. (Funktion kopiert und Veränderung angepasst damit man den unterschied sieht)
Nur gammelt jetzt wirklich ein mit new angelegter Char*-String im Speicher rum. ..
-
ruhig_brauner schrieb:
Nur gammelt jetzt wirklich ein mit new angelegter Char*-String im Speicher rum. ..
Vielleicht sollst du auch zeigen, dass du std::string kennst.
-
Ich peil nicht was du überhaupt machen willst: Kannst du nicht einfach std::string verwenden und gut?
Die Aufgabenstellung ist wirr, sowas bekommst du sicher nicht beim Einstellungstest, du lieferst hier höchstwarscheinlich deine eigene Interpretation ab.
-
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?
-
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.
