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
Libérer: 2024-12-02 21:20:11
original
533 Les gens l'ont consulté

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal