web-dev-qa-db-fra.com

Pourquoi ai-je une boucle infinie si j'entre une lettre plutôt qu'un chiffre?

J'écris ce code pour un devoir (juste pour commencer en C++, allez-y doucement). Nous venons de commencer la boucle while, do-while et for aujourd'hui. Le programme fonctionne correctement, sauf que si vous entrez une lettre lorsque le programme vous demande un entier, il sera bouclé indéfiniment. Que se passe-t-il? (Code ci-dessous) *** EDIT: Pour clarifier, la partie en boucle est: "Le nombre que vous avez entré est négatif. Veuillez entrer un nombre positif pour continuer." Mais l'utilisateur n'a pas la possibilité d'entrer un autre numéro. Il continue juste à imprimer ceci.

    #include <iostream>
using namespace std;

int main ( )
{
    //define variables
    int num1, num2, total;
    char answer1;

    do
    {
        //user enters a number
        cout << "\nPlease enter a positive number and press Enter: \n";
        cin >> num1;

        //check that the given num1 value is positive
        while (num1 < 0)
        {
            cout << "The number you entered is negative.\nPlease enter a positive number to continue.\n";
            cin >> num1;
        }

        cout << endl;

        //add the sum of 1 through num1 value
        num2 = 1;
        total = 0;
        while (num1 >= num2)
        {
            total = total + num2;
            num2 ++;
        }

        //tell the user the sum
        cout << "The total of all the integers\nfrom 1 to " << num1 << " is: \n";
        cout << total;

        //ask if the user wants to try again
        cout << "\n\nWould you like to try again with a new number?\nEnter y for yes or n for no.\n";
        cin >> answer1;
    } while (answer1 == 'y');   

    cout << endl;
    return 0;
}
15
user2907563

Voici comment fonctionne basic_istream. Dans votre cas, lorsque cin >> num1 reçoit une mauvaise saisie, failbit est défini et cin n'est pas effacé. Donc, la prochaine fois, ce sera la même mauvaise entrée. Pour gérer cela correctement, vous pouvez ajouter un contrôle de saisie et effacer & ignorer cin en cas de saisie incorrecte. Par exemple:

    #include<limits>

    //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";
            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);
13
Sergey

Cette réponse devrait résoudre votre problème. En gros, vous essayez de lire un caractère dans le flux et il ne peut pas être analysé comme un int, le flux reste donc dans un état d'erreur.

Vous devez rechercher une erreur, la supprimer et réagir en conséquence.

1
ghembo

Lorsque vous entrez une lettre, l'état d'erreur cin est défini et aucune autre entrée n'est possible avant d'appeler cin.clear(). En conséquence, l'instruction cin >> num1 ne modifiera pas la valeur de num1 et vous effectuerez une boucle indéfinie.

Essaye ça:

    while (num1 < 0)
    {
        cout << "The number you entered is negative.\nPlease enter a positive number to continue.\n";
        cin.clear();
        cin >> num1;
    }

MODIFIER:

Merci à Lightness de l'avoir signalé. Vous devriez également initialiser num1:

int num1=-1, num2, total;
1
Axel

Vous pouvez utiliser un type de données "char" comme entrée de l'utilisateur Puis utiliser "static_cast (" nom de variable ");

char input;
int choose;
cin >> input;
choose = static_cast<int>(choose) - 48;///then use 'if' statement with the variable 'choose'
0
Al-Hanash Moataz