Maison >développement back-end >C++ >Pourquoi les lettres provoquent-elles des boucles infinies dans les programmes de saisie de nombres C ?

Pourquoi les lettres provoquent-elles des boucles infinies dans les programmes de saisie de nombres C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-02 21:20:11526parcourir

Why Do Letters Cause Infinite Loops in C   Number Input Programs?

Comprendre les boucles infinies lors de la saisie de lettres au lieu de chiffres

Lors de l'exécution d'un programme qui demande la saisie d'un nombre entier, il est courant de rencontrer une boucle infinie si un utilisateur saisit une lettre au lieu d'un chiffre. Ce problème survient en raison du fonctionnement de la gestion des entrées en C.

La cause profonde :

En C, la fonction cin est utilisée pour lire les entrées. Cependant, si des caractères non numériques sont saisis, cin ne parvient pas à extraire un entier valide. En conséquence, l'indicateur failbit est défini dans l'objet flux cin, indiquant une erreur.

Réparer la boucle infinie :

Pour résoudre la boucle infinie, nous avons besoin pour détecter et gérer le scénario d’entrée non valide. Voici une partie modifiée du code qui corrige ce problème :

#include <limits> // Includes numeric_limits for input validation

// (...) Existing code

// user enters a number
cout << "\nPlease enter a positive number and press Enter: \n";
do {
    while (!(cin >> num1)) {
        cout << "Incorrect input. Please try again.\n";

        // Clear the failbit and ignore the remaining input
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    if (num1 < 0)
        cout << "The number you entered is negative. Please enter a positive number to continue.\n";
} while (num1 < 0);

Explication :

  • while (!(cin >> num1)) vérifie si cin a réussi à lire un entier. Si ce n'est pas le cas, il entre dans la boucle interne do-while pour gérer l'erreur.
  • cin.clear(); réinitialise l'indicateur failbit, permettant à cin de lire à nouveau l'entrée.
  • cin.ignore(numeric_limits::max(), 'n'); lit et supprime tous les caractères jusqu'à ce qu'un caractère de nouvelle ligne soit rencontré. Cela garantit que toute entrée invalide saisie avant la nouvelle ligne est rejetée.
  • Avec cette correction, le programme bouclera désormais uniquement lorsqu'un entier positif valide est entré, empêchant ainsi une boucle infinie due à une entrée invalide.

    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