cin.ignore (3) después de no poder obtener un doble con cin >> var

Estoy aprendiendo c ++ con c ++ Primer Plus, y estoy en el capítulo 7 e intento crear la siguiente función:

double getDouble(const char * message){
    double temp;
    std::cout << (message);
    if (!(std::cin >> temp)){
        std::cin.clear();
        std::cin.ignore(3); // Why does this work specifically?
        std::cout << "Input not double!" << std::endl;
        return 0.0;
    }
    return temp;

}

preguntado el 10 de mayo de 11 a las 13:05

C ++ Primer Plus no es tan buen libro. C ++ Primer (de Lippman) es mejor. -

Hasta ahora, este libro me ha resultado muy, muy útil. Como ya tengo experiencia en programación (sin embargo, no tengo nada que ver con los punteros. Ese concepto sigue siendo bastante alienante):

2 Respuestas

El estándar C ++ garantiza (§27.6.1.3 / 23 en el estándar '03) que pasar std::numeric_limits<std::streamsize>::max() ignorará todo en la secuencia hasta que se alcance el delimitador especificado o el final de la entrada. Así que cambia

std::cin.ignore(3);

a

std::cin.ignore(std::numeric_limits<std::streamsize>::max());

Usando números mágicos como 3 al llamar ignore rara vez es apropiado.

contestado el 10 de mayo de 11 a las 18:05

istream::ignore bueno, ignora los siguientes N caracteres o hasta que se alcanza el delimitador. El 3 me parece un número mágico aleatorio. ¿O qué querías saber?

contestado el 10 de mayo de 11 a las 17:05

@ultimate: Bueno, tal vez el autor pensó que sería suficiente. Funciona para entradas como "d23 32", pero "d23 32b" sería demasiado largo y la "b" permanecería en el búfer. - Xeo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.