2012-09-13 18 views
8
#include<iostream>; 

int main() 
{ 
    int a = 1; 
    int b = 2; 
    std::cin >> a >> b; 
    std::cout << a << "+" << b << "=" << a+b << std::endl; 
    return 0; 
} 

cuando entro 3 4 como entrada, la salida será 3+4=7, así, es extraño; Pero cuando ingreso a b, la salida es 0+0=0 (¿Por qué es 0 y 0?); El más confuso, a 4, será 0+0=0 (¿Por qué no '0 + 4 = 4' ?????); Luego escribo otro programa.¿Qué hace cin cuando hay un error

#include<iostream>; 

int main() 
{ 
    int a = 1; 
    int b = 2; 
    std::cin >> a; 
    std::cin.clear(); 
    std::cin >> b; 
    std::cout << a << "+" << b << "=" << a+b << std::endl; 
    return 0; 
} 

cuando entro a 4, ¿por qué es todavía 0+0=0? ¿No debería ser 0+4=4?

Gracias a todos los cordiales !!

Escribo prog3, para probar lo que sucederá cuando no escriba int a=1;int b=2;

2 

#include <iostream> 
using namespace std; 
int main() 
{ 
    int a,b; 
    cin >> a ; 
    cin >> b; 
    cout<< a << "+"<< b <<"="<< a+b << endl; 
    return 0; 
} 

Cuando a b nuevo, emite 0+-1218170892=-1218170892 (¿Por qué no es 0+0=0 ??)

+0

la entrada se espera que sea un número entero, no un personaje. Ingresar "a", "3.141" o "lo que sea" simplemente no es válido. Si su entrada es "a", el programa no sabe que ha usado "a" como variable y que desea usar el valor predeterminado en su lugar. – stefan

+0

Es obvio que es C++ 11, porque de lo contrario, los valores serían 1 y 2, no 0. – Drise

+0

Para responder a su edición: No ha eliminado una de la entrada. Necesitas 'cin.clear(); cin.ignore (1); ', para que la segunda extracción tenga éxito. – Drise

Respuesta

1

Como todos istreams, std::cin tiene bits de error. Estos bits se establecen cuando ocurren errores. Por ejemplo, puede encontrar los valores de los bits de error con funciones como good(), bad(), eof(), etc. Si lee la entrada incorrecta (fail() devuelve true), use clear() para borrar los indicadores. También es probable que necesite un ignore(1); para eliminar el carácter ofensivo.

Consulte la sección State functions para obtener más información. http://en.cppreference.com/w/cpp/io/basic_ios

+0

Gracias. Pero todavía estoy preguntándome por qué el valor de a y b ambos se convierten en 0 – user1668903

+0

Si lee la entrada incorrecta, 'malo()' todavía devolverá falso; es 'fail()' que devolverá verdadero. Y la página que cita se simplifica engañosamente, y simplemente se equivoca con respecto a 'bueno()' (que puede devolver falso incluso si no se ha producido ningún error). Tíralo y encuentra algo mejor. –

+0

Parece que está utilizando C++ 11: * Si la extracción falla, se escribe cero en valor y se establece failbit. ** (desde C++ 11) ***. – Drise

0

std :: cin es una instancia de istream y por lo tanto mantiene su estado de error cuando lee algo no válido.

Con el fin de "cura" que ambos deben aclarar su bandera

std::cin.clear(); 

y lavar su memoria intermedia.

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

Lo que es más sorprendente es que a pesar de que no vuelva 1 + 2 = 3 Cuando caracteres no válidos de entrada, lo que cabe esperar una corriente cin no tener efectos secundarios sobre lo que está tratando de actualizar .

+1

OP usa C++ 11: * Si la extracción falla, cero se escribe en valor y se establece failbit. ** (desde C++ 11) *** – Drise

+0

¿Es este el caso con los ints, o es una regla general para los tipos de usuario que si falla la transmisión, el objeto debería volver a su estado predeterminado? Siempre pienso que la transmisión a un objeto es una lógica defectuosa. Las fábricas crean objetos con datos leídos de las transmisiones, los objetos no se transmiten por streaming ... – CashCow

+0

"* la transmisión a un objeto tiene una lógica defectuosa. Las fábricas crean objetos con datos leídos de las transmisiones, los objetos no se transmiten a * * - transmisión con 'operator <<' es necesariamente en objetos preexistentes (dado el parámetro de referencia por referencia), y aunque una fábrica que crea un nuevo objeto puede ser deseable con bastante frecuencia, hay momentos en los que no lo haría (por ejemplo, cuando quiere almacenamientos intermedios y otros recursos el objeto ya se ha reutilizado para el siguiente valor) y cómo crearía la fábrica objetos en la pila (altamente deseable a menos que los objetos sean polimórficos en tiempo de ejecución, necesiten una vida útil prolongada, etc.)? –

0

El valor se establece en cero en un error según C++ 11: Si la extracción falla, se escribe cero en valor y se establece failbit.

En la 'a 4' ejemplo, ambos valores son 0 porque el búfer no ha sido ras/aclarado, por lo que la segunda lectura cin todavía está leyendo el error, y también recibe un valor de 0.

Cuestiones relacionadas