Maison >développement back-end >C++ >Pourquoi « cin » provoque-t-il des boucles infinies avec des incompatibilités de types ?

Pourquoi « cin » provoque-t-il des boucles infinies avec des incompatibilités de types ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-26 09:25:09387parcourir

Why Does `cin` Cause Infinite Loops with Type Mismatches?

Comprendre les boucles infinies avec cin lorsque le type ne correspond pas

Lors de l'utilisation de la fonction cin pour lire l'entrée, une boucle infinie peut se produire si l'entrée attendue est numérique mais les caractères sont saisis à la place. Cela se produit parce que cin échoue lorsqu'il rencontre une entrée non numérique et entre dans l'état d'échec, l'empêchant de demander une entrée supplémentaire.

Causes de la boucle infinie

Dans le code fourni :

unsigned long ul_x1, ul_x2;

while (1)
{
  cin >> ul_x1 >> ul_x2;
  cout << "ux_x1 is " << ul_x1 << endl << "ul_x2 is " << ul_x2 << endl;
}

Si une entrée non valide est fournie, cin échoue et reste dans cet état. En conséquence, la boucle n'entre jamais dans le bloc où cin lit à nouveau l'entrée, provoquant une boucle infinie.

Prévenir les boucles infinies

Pour éviter ce problème, on peut valider entrée en utilisant l'état d'échec de cin :

if (cin.fail())
{
  cout << "ERROR -- You did not enter an integer";

  // Clear fail state and discard bad input
  cin.clear();
  cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

Alternative : basée sur une chaîne Validation

Pour une validation plus complexe, il peut être avantageux de lire l'entrée sous forme de chaîne avant d'effectuer des vérifications spécifiques basées sur la chaîne pour garantir qu'elle répond au format attendu.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn