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.
3 Réponses :
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
Remplacez CIN >> TEMP; CODE> avec
GetLine (CIN, TEMP); CODE> Pour obtenir des chaînes séparées avec espèce blanche et après
CIN >> Rep; Code> Ajouter
cin.ignore (); code> pour rincer la nouvelle ligne. P>
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é:
Le problème que vous avez Avoir eu est que vous utilisiez 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 Une fois que nous obtenons la chaîne de texte que l'utilisateur entrait, nous faisons ensuite une variable String CODE> Variable nommée Cependant, nous avons besoin de cette copie depuis 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> -example- 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>
'\ 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>
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>
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>
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>
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';
}
Pourquoi pas seulement
:: std :: string r = argv [1]; :: std :: inverse (r.begin (), r.end ()); retour r! = argv [1]; code>?