bucles: validar un número usando c++

CorePress2024-01-25  9

Estoy intentando validar un número entero ingresado por el usuario (getUserInteger). Cuando el valor de la entrada no es un número entero, se supone que el bucle while borra el búfer, restablece el estado de error del búfer, imprime "entrada incorrecta, vuelve a intentarlo": y luego solicite un nuevo número.

Parece que todo funciona bien hasta que se solicita un nuevo número. "cin>> número" dentro del bucle nunca parece "acertar" y continúa iterando a través del bucle y buscando una "entrada incorrecta ...". Por mi vida no puedo entender por qué. ¡Gracias por la ayuda!

#include <iostream>
#include <string>
#include <limits>
using namespace std;

// ----- Prototypes -----
int getUserInteger();

// ----- Main -----
int main (){
    int userNumber;
    userNumber = getUserInteger();
}

// ----- Functions -----
int getUserInteger() {
    int number;
    cin >> number;
    while ( cin.fail() ) {   // read failed, not int?
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); //clear buffer through 'enter'
        cin.clear();      // reset error buffer
        cout << "bad entry, try again: " << endl;
        cin >> number;
    }
    return number;
}


------------------------------------

cin.ignorare debería venir después de cin.clear.

Incorrecto:

        cin.ignore(numeric_limits<streamsize>::max(), '\n'); //clear buffer through 'enter'
        cin.clear();      // reset error buffer

Corregido:

        cin.clear();      // reset error buffer
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); //clear buffer through 'enter'



------------------------------------

_cin.ignore debe aparecer después de cin.clear.

#Incorrecto:

    cin.ignore(numeric_limits<streamsize>::max(), '\n'); //clear buffer through 'enter'
    cin.clear();      // reset error buffer

Corregido:

    cin.clear();      // reset error buffer
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); //clear buffer through 'enter'
Compartir Seguir respondido

22 de abril de 2021 a las 19:10

sieucapcutee

sieucapcutee

1

1

1 insignia de bronce

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare