umkehren einer Zeichenfolge mit Zeigern
Ich muss zugeben, ich habe keine Ahnung, wie man Zeiger verwenden, aber ich habe versucht, nicht weniger. das problem mit meinem Programm ist, dass es zeigt die Zeichenfolge in umgekehrter, außer für das, was war der erste Buchstabe zu fehlen, und der komplette string wird verschoben, um ein Leerzeichen vorwärts mit dem ersten element leer ist.
zum Beispiel zeigen die "olle" bei der Eingabe "Hallo".
#include <iostream>
#include <string>
using namespace std;
string reverse(string word);
int main()
{
char Cstring[50];
cout<<"enter a word: ";
cin>>Cstring;
string results = reverse(Cstring);
cout <<results;
}
string reverse(string word)
{
char *front;
char *rear;
for (int i=0;i< (word.length()/2);i++)
{
front[0]=word[i];
rear[0]=word[word.length()-i];
word[i]=*rear;
word[word.length()-i]=*front;
}
return word;
}
Der neue code funktioniert perfekt. geändert Saiten cstrings. die Frage technisch gebeten, für cstrings, aber ich finde strings leichter, so dass ich mit Zeichenfolgen zu arbeiten, dann machen die notwendig, änderungen zu machen, c string. herausgefunden ho initialisieren der Rückseite und front.
#include <iostream>
#include <cstring>
using namespace std;
string reverse(char word[20]);
int main()
{
char Cstring[20];
cout<<"enter a word: ";
cin>>Cstring;
string results = reverse(Cstring);
cout <<results;
}
string reverse(char word[20])
{
char a='a';
char b='b';
char *front=&a;
char *rear=&b;
for (int i=0;i< (strlen(word)/2);i++)
{
front[0]=word[i];
rear[0]=word[strlen(word)-1-i];
word[i]=*rear;
word[strlen(word)-1-i]=*front;
}
return word;
}
char
Hinweise, die Sie noch nicht initialisiert ist, wird front
und rear
.Sie haben nicht zugewiesenen Speicher für
front
und rear
sind, so sind Sie Berufung ein Undefiniertes Verhalten bei der Verwendung von front[0]
und rear[0]
. Abgesehen davon, dass der Letzte index des Wortes ist word[word.length() - 1]
ist und Sie sollten word[word.length() - 1 - i]
.also, was ich zu initialisieren, alle alten Charakter oder etwas bestimmtes, als ich gesagt habe, ich bin ganz neu mit Zeigern.
"ich habe keine Ahnung, wie Zeiger verwenden" — gut, das hier planet braucht weniger Zeigern und mehr gesund, für Menschen lesbaren code. Bitte helfen Sie, die Welt Stempel aus Zeigern, indem Sie sich weigern, Sie zu erlernen.
ok. ich sehe, denke ich mir. also im Grunde versuche ich, t Zugriff auf eine nicht existente element in word.
InformationsquelleAutor user2420395 | 2013-06-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
dann später
Nicht gut. Dereferenzieren von nicht initialisierten Zeigern ruft zu undefiniertem Verhalten.
Abgesehen davon, dass dein code ist zu kompliziert, es ruft
strlen()
während jeder iteration (und das sogar mehrmals), was ist überflüssig, und die swap-Logik ist auch unnötig Komplex. Versuchen Sie es mit zwei Zeigern statt und wird sich der code viel sauberer:Der Sache ist allerdings, dass in C++ gibt es selten einen guten Grund für die Verwendung von raw-Pointern. Wie wäre es mit
std::reverse()
statt?front
undrear
behoben wurden in der zweiten Auflage in Frage, aber das ist ... interessant-code, sagen wir. Und der Missbrauch vonstrlen()
ist ziemlich krass zu.Danke. Yap, und ich nicht einmal erwähnen möchte, die nicht lesbar spaceless-coding-style, das ist nicht unbedingt ein technischer Fehler, aber macht immer noch code sehen sehr unprofessionell aus.
InformationsquelleAutor
InformationsquelleAutor stewart99
kann man es auch so:
es erfolgreich funktioniert auf meinem system ,d.h. auf emacs+gcc auf windows 7
front[0]
vs*front
undrear[0]
vs*rear
. Dies ändert nicht die Funktion des code; nur die Nomenklatur ist anders. Ich bin mir nicht sicher, warum würden Sie erwarten, dass alle Kredit für Sie, daher. Es ist sogar ein sehr guter Algorithmus. Es gibt viel zu viele benutzt derstrlen()
vernünftig zu sein. Die beste Lösung mit C Zeiger ist weit einfacher.Es bedeutet, dass ich möglicherweise nicht gesehen haben, Bearbeiten Sie in dieser Zeit oder ich konnte Sie nicht bezahlt haben, die Aufmerksamkeit auf Sie, zu dieser Zeit gab es wichtige Probleme, wie Sie sehen können, die OP hatte nicht initialisiert vorne und hinten-Variablen in dieser Zeit,und wie Sie sehen können, mir war die einzige Antwort, so dachte ich akzeptieren, es wird nicht Schaden, aber jetzt andere "bessere" Antwort verfügbar ist , kann ich nicht erwarten, dass alle Kredite zu löschen.Es kann nicht untergraben werden, dass neue user hier sehnen sich nach den "Ruf" so, das war meine Sache.Wenn Sie das Gefühl meiner ist nicht sehr gut beantworten,sind Sie gut genug, um nach unten Stimmen!
InformationsquelleAutor 0decimal0