2017-09-30 1 views
-1

Je voulais créer une fonction qui renvoie true/false si l'entrée est un palindrome ou non, quand abcddcba ou aba ne donne pas vrai, mais il le devrait. aide plzC++ palindrome ne fonctionnait pas

bool checkPalindrome(char input[],int p=0) { 
    if(input[1]=='\0'){ 
     return true; 
    } 
    if(sizeof(input)%2==0) { 
     int a = sizeof(input); 
     for(int i=0;i<(a/2);i++) { 
      if(input[0+i]==input[a-i-2]){ 
       p++; 
      } 
     } 
     if(p==a/2){ 
      return true; 
     } else{ 
      return false; 
     } 
    } 
    else{ 
     int a = sizeof(input); 
     for(int i=0;i<((a-1)/2);i++) 
     { 
      if(input[0+i]==input[a-i-2]){ 
       p++; 
      } 
     } 
     if(p==(a-1)/2){ 
      return true; 
     } else{ 
      return false; 
     } 
    } 
} 
+4

Si vous n'avez jamais utilisé un débogueur avant, est maintenant le moment idéal pour apprendre à utiliser un. Avec un débogueur, vous pouvez parcourir votre code ligne par ligne tout en surveillant les variables et leurs valeurs. Je vous recommande également de prendre le temps de lire [Comment déboguer de petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) par Eric Lippert. –

+2

'sizeof (entrée)' retournera 'sizeof (char *)' –

+0

pour (int i = 0; i Taz742

Répondre

1

votre code est trop long. Il y a un moyen simple: itérer une fois sur les éléments de la chaîne en comparant le n-1 avec 0 et n-2 avec 1 et ainsi de suite.

Si deux caractères ne sont pas de retour identiques faux sinon continuer à vérifier:

bool checkPalindrome(char* str) { 
    const int size = strlen(str); 
    for(int i(0), j(size) - 1); i < size/2; i++, j--) 
     if(str[i] != str[j]) 
      return false; 
    return true; 
} 

int main(){ 

    char* str = "level"; 
    cout << checkPalindrome(str); 

    cout << endl << endl; 
    return 0; 
} 
+0

Vous encourez une pénalité de performance pour l'appel de 'strlen' à chaque itération de la boucle for. Vous faites aussi deux fois plus de comparaisons que nécessaire. – selbie

+0

@selbie: Je l'ai édité. –

+0

Nice! Mais si c'est une question C++, et si nous sommes en 2017, quelqu'un peut-il nous expliquer pourquoi nous n'utilisons pas 'string' mais toujours' char * '? – Christophe

3

de style C++:

bool checkPalindrome(const std::string& str) 
{ 
    size_t len = str.size(); 
    for (size_t i = 0; i < len/2; i++) 
    { 
     if (str[i] != str[len-1-i]) 
      return false; 
    } 
    return true; 
} 

style C:

bool checkPalindrome(const char* str) 
{ 
    size_t len = str ? strlen(str) : 0; 
    for (size_t i = 0; i < len/2; i++) 
    { 
     if (str[i] != str[len-1-i]) 
      return false; 
    } 
    return true; 
} 

Dans les deux cas, vous pouvez avoir besoin évaluer (demander) si une chaîne vide doit être considérée comme un palindrome ou non.

0

la version C++ à partir de chaînes et itérateurs (uniquement pour un souci d'exhaustivité, les autres réponses sont déjà très bien):

bool checkPalindrome(const string& str) { 
    for (auto p = str.begin(),q = str.end(); p!=q && p!=q+1; p++) 
     if (*p!=*--q)  // if char from front doesn't match char from rear ? 
      return false; // then it's not a palindrome ! 
    return true; 
} 

Explications: l'itérateur p commence à l'avant de la chaîne et q à l'arrière (après le dernier caractère). p avancera et q ira en arrière. Si p atteint q ou si p a passé q (cas particulier si le mot a une longueur égale), c'est fini et on peut conclure un palindrome. Mais si auparavant, il y avait une différence entre le caractère p et le caractère précédant q, ce n'est pas un palindrome.

Online demo, with little test suite