Der Zeiger ist nicht schreibgeschützt. (Die String-Daten selbst sind zwar, aber ein Zeiger, der auf sie zeigt, kann frei geändert werden.) Das Zuweisen eines Zeichens zu einem Zeiger führt jedoch nicht zu dem, was Sie erwarten.
Im Allgemeinen können Sie einem Punkt nur eine Adresse zuweisen. Sie können keine Werte zuweisen, nur die Adresse von Werten.
String-Literale (wie "Hallo Welt") sind die einzige Ausnahme, da Strings speziell sind. Wenn Sie einem Zeiger einen davon zuweisen, erhalten Sie einen Zeiger auf diesen String. Im Allgemeinen weisen Sie Adressen jedoch Zeigern zu.
Der andere Punkt ist, dass Zeichen in C++ integrale Datentypen sind. Sie können als ganze Zahlen ohne Gußteil behandelt werden. Ich kann int i = 'W'
tun und der Compiler wird sich nicht beschweren.
Was passiert also, wenn Sie einem Zeiger 'W' zuweisen? Es nimmt 'W' als Integer-Wert an und nimmt an, dass dies eine Adresse ist. "W" hat den ASCII-Wert 127, so dass Sie den Zeiger so einstellen, dass er auf Adresse 127 zeigt, was keinen Sinn ergibt.
Ich sehe nicht, wie das mit Ihrem Code viel zu tun hat. Das Problem scheint dort zu sein, dass temp
nicht auf gültige Daten zeigt. Sie deklarieren einen Zeiger, der auf eine nicht definierte Adresse zeigt. Und dann sagen Sie „, wo es auf die Punkte, ich möchte den Wert schreiben, dass s
Punkte Die folgende Beschreibung ist etwas besser funktionieren.
char temp; // not a pointer. We want a character to store our temporary value in
while (s <= e) {
temp = *s; // note, no * on temp.
*s = *e;
*e = temp; // note, no * on temp.
e--;
s++;
}
Wenn jedoch str
verweist auf eine Stringliteral, wie‚Hallo Welt‘ , dann ist das nicht legal, weil die String-Daten selbst schreibgeschützt sind.Der Compiler kann es nicht erzwingen, aber dann haben Sie sich in undefiniertes Verhalten Land.Wenn Sie die Zeichenfolge ändern möchten, kopieren Sie es in ein lokaler Puffer, wie eine der anderen Antworten zeigte
Sie scheinen ein bisschen verwirrt über die Semantik von Zeigern.Vergeben Sie eine Adresse (oder etwas, das in eine Adresse umgewandelt werden kann, wie eine ganze Zahl) zu einem Zeiger Der Zeiger zeigt auf diese Adresse. Es ändert die angezeigten Daten nicht. Das Deklarieren eines Zeigers bedeutet nicht, dass er auf etwas Sinnvolles zeigt. Wenn Sie ein Zeichen speichern möchten, deklarieren Sie eine Zeichenvariable. Ein Zeiger speichert keine Daten, sondern nur Daten, die an anderer Stelle zugewiesen wurden.
bearbeiten Kommentare und Korrekturen zu Ihrem aktualisierten Code:
void something(const char * str) { // let the function take a pointer to a non-modifiable string, so add the const. Now it's clear that we're not allowed to modify the string itself, so we have to make a copy.
char *s = new char[strlen(str) + 1]; // Since the original string is const, we have to allocate a copy if we want to modify it - in C, you'd use malloc(strlen(str)) instead
strcpy(s, str);
char *e = s; // make e point to the start of the copied string (don't allocate two copies, since e and s are supposed to work on the same string
while (*e != '\0') { // add braces so it's clear where the loop starts and ends.
e++;
}
e--;
while (s <= e) { // the loop condition wouldn't work if s and e pointed to separate copies of the string
cout << *e; // why? I thought you just wanted to reverse the string in memory. Alternatively, if you just want to print out the string reversed, you don't need to do most of the rest of the loop body. In C, you'd use printf instead of *e
char temp = *s; // might as well declare the temp variable when you need it, and not before
*s = *e;
*e = temp;
e--;
s++;
}
}
nur als Referenz, und als Reaktion auf die Kommentare über C vs C++, hier ist, wie ich eine Funktion schreiben, würde eine Zeichenfolge umkehren in C++:
std::string revert_string(const std::string& str) {
return std::string(str.rbegin(), str.rend());
}
Oder die Zeichenfolge in-Ort zurückzukehren:
std::string revert_string(const std::string& str) {
std::reverse(str.begin(), str.end());
}
Die Art, wie ich das lese, ist Ihr * s = 'W' nur ein Beispiel für etwas, von dem Sie wissen, dass Sie es nicht tun können? Es hat nichts mit dem unten stehenden Code zu tun, wozu Sie eigentlich Hilfe benötigen? Fragen Sie mich einfach, denn die meisten Antworten scheinen sich auf das erste Beispiel zu konzentrieren. – jalf
Ja, ich weiß, dass ich das nicht tun kann :(Ich habe mich gefragt, wie ich das richtig machen soll. Ich habe alle Ratschläge implementiert, also vielleicht habe noch ein looksy? – pypmannetjies
Mach was richtig? Ich bin immer noch ein wenig unklar, was deine Frage ist. Du versuchst eine Saite umzukehren, es scheint? Ich bin nur nicht sicher, ob das "* s = 'W'" Teil hatte irgendeine Relevanz für die Frage selbst. Auch wenn die Löschungen verursachen, segfolds, müssen Sie diese auch. – jalf