0
votes

Code de vérificateur Palindrome coincé dans une boucle infinie

J'ai un problème où je concevons un vérificateur de palindrome. Je n'ai aucun problème avec des mots simples ("midi", "2002", etc.), mais à chaque fois que je tape dans une phrase qui a plusieurs mots avec des espaces (tels que "animal de compagnie stratifié"), mon programme perd son esprit et va dans une boucle infinie. Peut-être que cela a quelque chose à voir avec les chèques (assurez-vous que la chaîne n'est pas nulle ou supérieure à 80 caractères) que j'ai mis à l'intérieur? J'ai été mis à pied du débogage sans succès. Je pense que cela a quelque chose à voir avec la manière dont la chaîne est stockée en mémoire, mais je ne peux pas la placer exactement. XXX


1 commentaires

Pourquoi pas seulement :: std :: string r = argv [1]; :: std :: inverse (r.begin (), r.end ()); retour r! = argv [1]; ?


3 Réponses :


3
votes

std :: CIN CODE> 'S >> CODE> L'opérateur ne lit qu'au prochain personnage de WhitSpace. Si vous souhaitez lire la ligne entière, utilisez std :: getline (getline () code>.

cin >> temp; //reads until the next whitespace
getline(cin, temp); //reads until the next newline character


0 commentaires

0
votes

Remplacez CIN >> TEMP; avec GetLine (CIN, TEMP); Pour obtenir des chaînes séparées avec espèce blanche et après CIN >> Rep; Ajouter cin.ignore (); pour rincer la nouvelle ligne.


0 commentaires

0
votes

Je pense que vous êtes trop compliqué ce code: je vais vous montrer une version simplifiée dans quelques lignes de code. Le code est propre, concis, lisible et très expressif; Cela fera exactement ce qu'il dit que ça va faire. Ensuite, je vais expliquer où vous avez mal tourné en finition avec une description de ma mise en œuvre tout en utilisant un outil ou un algorithme approprié pour obtenir le travail effectué:


xxx pré>

Le problème que vous avez Avoir eu est que vous utilisiez std :: Cin >> variable code> et cela prendra en texte jusqu'au premier Blanc Space Caractère Code> Il voit. Le reste du texte sur cette ligne est toujours dans le tampon mais n'est pas stocké dans votre variable. Ici, vous devez utiliser std :: getline () code> et il faut au moins deux paramètres, le premier étant la source de l'entrée telle que std :: Cin Code> ou STD :: ifstream code> ou std :: istringingstream code> etc. Le deuxième paramètre est la variable que vous souhaitez stocker vos informations. P>

Il existe un troisième paramètre facultatif et, dans ce cas, nous voulons l'utiliser. Les troisièmes paramètres recherchent un délimiteur et, dans ce cas, nous voulons rechercher le premier caractère Newline '\ n' code>. La raison pour laquelle nous souhaitons l'utiliser ici est qu'elle le récupérera à partir du tampon iostream, mais il ne la stockera pas dans votre chaîne. C'est bon pour quand on vérifie si c'est un palindrome. p>

Une fois que nous obtenons la chaîne de texte que l'utilisateur entrait, nous faisons ensuite une variable String CODE> Variable nommée vérificateur code> et l'initialise avec l'entrée d'origine . Nous voulons une copie directe car il existe un algorithme que l'on trouve dans l'en-tête code> algorithme code> appelé std :: inverse code> et pour nos besoins, c'est parfait! P>

Cependant, nous avons besoin de cette copie depuis std :: inverse code> fera les opérations en place. Nous ne voulons pas perdre notre chaîne d'origine. Alors maintenant, notre vérificateur sera dans l'ordre inverse de l'entrée d'origine. Ensuite, il s'agit d'une simple affaire d'une seule comparaison à voir si les deux chaînes sont égales, s'ils affichent le message approprié et si ce n'est pas le même. Enfin, nous imprimons un message demandant si l'utilisateur veut arrêter ou non. P>


EDIT: strong> - Note: em> - J'avais oublié ou négligé une chose simple à propos de ce programme, le Palindrome dans ce qui précède est Case Code> Sensible CODE>, nous pourrions faire l'une des trois choses, nous pourrions d'abord la quitter comme c'est à l'endroit où nous nous attendons au fait que 'a'! = "A"! = code>. Nous pourrions résoudre ce problème en convertissant tous les alpha en :: touper code> ou :: textower code> Supprimer toute sensibilité des cas, mais ces fonctions fonctionnent sur des caractères simples et non une chaîne complète, donc Nous devrions écrire une fonction pour effectuer tous les personnages de la chaîne, soit tout majuscule, soit tous minuscules ou appeler un autre algorithme agréable par la STL et c'est std :: transformer (...) code>. Encore une fois std :: transformer () code> se trouve dans la bibliothèque code> algorithme code>. Dernier point mais non le moindre, nous pourrions donner à l'utilisateur un choix entre les deux versions. Je laisserai cette partie à vous comme un exercice. P>

-example- std :: transformer code> p>

{
    std::string str( "HelLo" );
    std::cout << str << '\n';
    std::transform( str.begin(), str.end(), str.begin(), ::toupper );
    std::cout << str << '\n';
    std::transform( str.begin(), str.end(), str.begin(), ::tolower );
    std::cout << str << '\n';
}


0 commentaires