Comprendre les boucles infinies avec les erreurs de type cin et numérique
Dans certains scénarios de programmation, nous pouvons rencontrer des comportements de boucle infinie lors de l'utilisation de cin pour saisir des chaînes en attendant des valeurs numériques. Cet article approfondit ce problème et propose des solutions possibles.
Explication de la boucle infinie
La boucle que vous avez fournie :
while (1) { cin >> ul_x1 >> ul_x2; cout << "ul_x1 is " << ul_x1 << endl << "ul_x2 is " << ul_x2 << endl; }
sera sans fin itérer si des caractères sont saisis à la place des chiffres. En effet, lorsque cin rencontre une entrée non numérique, il entre dans un état d'échec et cesse de demander d'autres entrées. Par conséquent, la boucle reste bloquée sans permettre aucune interaction de l'utilisateur.
Détection des entrées non numériques
Pour éviter ce problème, il est crucial de détecter les entrées non numériques. Une approche simple consiste à vérifier si cin est en état d’échec. Voici un exemple :
if (cin.fail()) { cout << "ERROR -- You did not enter an integer"; // Clear the fail state and discard bad input cin.clear(); cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }
Ce code vérifie l'état d'échec, affiche un message d'erreur et efface l'état d'échec. L'appel à cin.ignore() élimine tous les caractères restants dans le tampon d'entrée qui pourraient avoir provoqué l'erreur.
Considérations supplémentaires
Pour des exigences de validation plus complexes, il Il peut être avantageux de lire d'abord l'entrée sous forme de chaîne, puis d'effectuer des vérifications supplémentaires pour garantir qu'elle correspond au format attendu. Cela peut offrir une plus grande flexibilité et personnalisation dans la gestion de la validation des entrées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!