Probleme beim übergeben von Buchstaben
-
#include<iostream> #include<string> using namespace std; string eingabe; int len; bool boolean; bool test(string eingabe,int len) { char* wort; wort=new char[len]; char* wort2; wort2=new char[len]; wort=0; wort2=0; string::iterator i; for (i=eingabe.begin(); i!=eingabe.end(); i++) { wort=i; wort2=i; wort++; wort2++; } for (wort=0,wort2;wort<wort2;wort++,wort2--) { [b]if (*wort==*wort2) boolean=true;[/b] else { boolean=false; wort=wort2; } } return boolean; } void main() { std::cout<<endl<<"Bitte geben Sie ein Palindrom ein: "; std::cin>>eingabe; len=eingabe.length(); std::cout<<endl<<eingabe<<endl<<len;; boolean=test(eingabe,len); if (boolean=true) cout<<endl<<eingabe<<" ist ein Palindrom!"; else cout<<endl<<eingabe<<" ist kein Palindrom"; }Hallo zusammen !
Habe obiges Programm für die Uni geschrieben. Aufgabe ist herauszufinden, ob ein eingebenes Wort ein Palindrom ist. Mein Programm stürzt bei fettgedruckter Stelle einfach ab. Habe dcoh eigentlich alles richtig gemacht. Wisst ihr, wo der Fehler liegt?
LG Boese
-
boese schrieb:
... wort=0; wort2=0; ...das ist schon mal schlecht, damit verlierst du die anfangsadressen der beiden char arrays.
hab's nur überflogen, aber sorry, das programme scheint auch sonst ziemlicher mist zu sein...
-
Hi!
Ganz einfach, an der Stelle wo es abstürzt dereferenzierst du ein Objekt das auf 0 zeigt. Deine Anwendung hat sowieso schon viel früher ein Speicherleck.
Hier:wort=0; wort2=0;setzt du deine Zeiger auf Null, nicht deren Inhalt. Das gleiche auch hier:
wort=i; wort2=i;Außerdem, wenn du wort und wort2 auch noch mit ++ auf das nächste Element zeigen lassen willst, dann verlierst du den Zeiger auf den Anfang des Elements.
Der nächste Fehler ist hier:for (wort=0,wort2;wort<wort2;wort++,wort2--)Ok wort2 dekrementierst du wieder. Kann gut gehen, muss aber nicht. wort hast du aber wieder auf null gesetzt. Das kann nicht funktionieren.
Also ich würde sagen du hast die Funktionsweise von Zeigern noch nicht verstanden.
Du kannst einem Zeiger nicht einen Wert zuweisen, dass lässt ihn nicht auf eine Position zeigen, sondern weißt ihm eine Adresse zu auf die der Zeiger dann zeigt. Wenn du versuchst das zu dereferenzieren fliegt dir natürlich die Anwendung um die Ohren weil du auf Speicher zugreifst der dir nicht gehört.Du solltest mit Indizierung auf die einzelnen Elemente des Arrays zugreifen, etwa so:
for(int i=0; i<len; ++i) wort[i] = eingabe[i];Das ist aber nichts anderes als den Inhalt von eingabe nach wort zu kopieren. Noch einfacher geht es so:
char *wort = new char[len+1]; // +1 für endekennung '\0' strncpy(wort, eingabe.c_str(), len); wort[len]=0; // oder '\0' für die StringendekennungGreetz
-
probier mal so:
// eingabe: string als char* // ausgabe: 1 == palindrom, 0 == kein palindrom int palindrom (/*const*/ char *str) { int n = strlen(str) - 1; int s = 0; for (;; s++, n--) { if (str[s] != str[n]) return 0; if (s >= n) break; } return 1; }
-
Wow! Vielen Dank erstmal für eure schnelle Hilfe.
Das mein Programm ziemlicher Mist ist und ich Zeiger nicht wirklich verstanden habe, das dachte ich mir fast. Die Sache ist folgende: Ich habe gerade erst "Einführung in die Informationstechnik für Ingenieure" und das Programm ist eine Hausaufgabe. Mir fehlt zur Bearbeitung einfach der nötige Fundus an Befehlen. Könnt ihr mir einen Tipp geben, wie ich Probleme selber lösen kann, ohne dass ich hier immer nachfragen müsste.
LG Boese
-
Hi!
Ein gutes Tutorial und/oder Anfänger-Buch sollten dir dabei helfen. Bezüglich Bücher benutz einfach die Forensuche, dazu gabs hier im C++-Forum schon viele Diskussionen. Ebenso bezüglich Tutorials, hier aber eben 2 Links:
http://tutorial.schornboeck.net/inhalt.htm
http://www.volkard.de/Cpp/Tutorial/index.htmlDu kannst aber auch mal in die Bücherecke und in die Tutorialecke gucken (s. oben rechts).
Greetz
-
Warum benutzt du nicht durchgehend in deinem Programm die string-Klasse?