2017-06-13 5 views
0

Ich habe einen Code geschrieben, um zu prüfen, ob eine Zeichenkette Palindrom ist oder nicht, die Leerzeichen und Sonderzeichen ausschließen sollte und in Groß- und Kleinschreibung nicht beachtet werden sollte. Die Funktion Palindrome (String A) nimmt also einen String auf und gibt 1 zurück, wenn es ein Palindrom ist, und 0, wenn es nicht ist.Palindrome ohne Sonderzeichen und Leerzeichen

Zum Beispiel: Eingabe: Ein Mann, ein Plan, ein Kanal: Panama Ausgang: 1 Unten ist die Code-

int isPalindrome(string A) { 
    string::iterator it; 
    string::reverse_iterator rit; 
    it=A.begin(); 
    rit=A.rbegin(); 
    while(it!=A.end() && rit!=A.rend()){ 
     while(!isalnum(*rit))  //if char from the end is not alphanumeric, then increment the reverse iterator till we find the alphanumeric char. 
      ++rit; 
     while(!isalnum(*it))  //if char from the start is not alphanumeric, then increment the iterator till we find the alphanumeric char. 
      ++it; 
     if(tolower(*it)!=tolower(*rit)) //case in-sensitive comparison 
      return 0; 
     ++it; 
     ++rit; 
    } 
    return 1; 
} 

Es ist gut für alle Variationen von Eingabe funktioniert wie A man, a plan, a canal: Panama" oder "A man, a plan, a canal: Panama aber Wenn ich "A man, a plan, a canal: Panama" eingabe, schlägt es mit Laufzeitfehler fehl.

Bitte lassen Sie mich wissen, wo ich falsch liege?

+3

Es klingt wie Sie müssen lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver

+0

Sie haben vergessen zu prüfen, ob es das Ende in der inneren ' während ". Wie bereits gesagt, können Sie ohne Debugger nicht entwickeln. – Boiethios

Antwort

0

Das Problem war, dass beide Iteratoren möglicherweise das Ende in den verschachtelten while-Schleifen erreicht haben, sollte dies überprüft werden.

int isPalindrome(string A) { 
    string::iterator it; 
    string::reverse_iterator rit; 
    it=A.begin(); 
    rit=A.rbegin(); 
    while(it!=A.end() && rit!=A.rend()){ 
     while(rit != A.rend() && !isalnum(*rit))  //if char from the end is not alphanumeric, then increment the reverse iterator till we find the alphanumeric char. 
      ++rit; 
     while(it != A.end() && !isalnum(*it))  //if char from the start is not alphanumeric, then increment the iterator till we find the alphanumeric char. 
      ++it; 

     if (it == A.end() || rit == A.rend()) 
      break; 

     if(tolower(*it)!=tolower(*rit)) //case in-sensitive comparison 
      return 0; 
     ++it; 
     ++rit; 
    } 
    return 1; 
} 
+2

Sie sollten zumindest erklären, was falsch war und was Sie behoben haben, anstatt blanken Code bereitzustellen. – Slava

Verwandte Themen