2016-10-02 3 views
-1
#include <iostream> 
#include <string> 


using namespace std; 


bool isPalindrome(string str){ 



    for(int i = 0; i <= str.length()-1; i++){ 
     if(str[i] != str[str.length()-1-i]){ 
      return false; 
     }else { 
      return true; 
     } 
    } 
} 

main(){ 

    string text; 

    do{ 
     cout << "Enter some Text: " << endl; 
     cin >> text; 
     if(isPalindrome(text)){ 
      cout << "The text is a palindrome" << endl; 
     } 
     else{ 
      cout << "The text is not a palindrome" << endl; 
     } 

    }while(text != "Q"); 

    return 0; 
} 

Kann mir jemand erklären, was mit meinem Code falsch ist? Wenn ich "otto" als Text eingabe, erzeugt der Code die richtige Antwort. Wenn In Eingabe "ottop" als Text, der Code funktioniert auch, aber wenn ich "ottopo" eingeben, bekomme ich als Ausgabe, dass "ottopo" ein Palindrom ist, was es offensichtlich nicht ist.C++ Palindrom Funktion

Ich scheine etwas zu verpassen oder habe vielleicht etwas übersehen. Ich weiß, dass ich C++ Standard-Bibliotheksfunktionen dafür verwenden könnte, aber ich möchte wirklich wissen, warum es nicht so funktioniert, wie ich es will.

Ich habe Palindrome-Funktionen in Java, Python, Javascript, Ruby ect implementiert ... Ich kann einfach nicht meinen Fehler innerhalb dieses C++ Codes finden! Ich weiß, es ist wirklich simpel, aber es ist so frustrierend!

+0

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+1

'return' kehrt von einer Funktion zurück. – melpomene

+0

Zum einen kehrt 'return' von Ihrer Funktion zurück. Das bedeutet, dass Ihre Schleife nur die erste Iteration ausführt, die 'return'-Anweisungen bewirken, dass sie während dieser Iteration zurückkehrt und niemals weiter als der erste/letzte Zeichenvergleich. –

Antwort

0

Sie müssen keine return true nach der Else-Anweisung haben. Setzen Sie das außerhalb der for-Schleife und Ihr Code sollte funktionieren.

Als extra Nitpick müssen Sie nicht erst überprüfen, ob Strlen - 1, aber Strlen (s)/2 tatsächlich genug ist. Ich überlasse es dir, das herauszufinden, da es ganz einfach ist und sich nicht zu sehr von dem unterscheidet, was du überhaupt tust.

0

Sie geben true bei der ersten Iteration der Schleife zurück. Und Sie müssen nur die Hälfte der Saite durchlaufen.

Korrigierte:

size_t len = str.length(); 

    for(int i = 0; i < len/2; i++){ 
     if(str[i] != str[len-1-i]){ 
      return false; 
     } 
    } 
    return true; 
0

Da es die return true; nicht in der else sein sollte, aber nach dem Ende der Schleife for gesagt,. Dies kann auch in nur wenigen Zeilen erreicht werden. Eine Zeichenkette ist ein Palindrom, wenn es umgekehrt ist wie es normalerweise ist. Alles, was Sie brauchen, ist

reversedText = reverse(text.begin(), text.end()); 
if (text == reversedText) 
    //indicate that it is a palindrome 
else 
    //indicate that it is not a palindrome` 

Seien Sie einfach sicher, Algorithmus zu enthalten. Ich kann verstehen, wenn Sie aus irgendeinem Grund keine Bibliothek verwenden möchten, aber ich möchte nur sicherstellen, dass Sie wissen, dass dies sehr einfach durchgeführt werden kann.

+0

danke für deine antwort! Ich weiß, dass es sehr leicht mit Bibliotheksfunktionen gemacht werden kann, aber manchmal ist es eine gute Übung, es auf "harte" Weise zu machen! – BamBam281189

+0

@ BamBam281189 Ich verstehe das. Ich habe viele Male ähnliche Dinge gemacht. Ich glaube, dass es mir hilft, die Sprache besser zu lernen. – TGrossb

Verwandte Themen