2012-09-13 15 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; 
} 

quando entro 3 4 come ingresso, l'uscita sarà 3+4=7, beh, è ​​strano; Ma quando inserisco a b, l'output è 0+0=0 (Perché è 0 e 0?); Il più confuso, a 4, sarà 0+0=0 (Perché non '0 + 4 = 4' ?????); Poi scrivo un altro prog.Che cosa significa cin fare quando si verifica un errore

#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; 
} 

quando entro a 4, perché è ancora 0+0=0? Non dovrebbe essere 0+4=4?

Grazie a tutti gli spensierati !!

Scrivo prog3, per testare cosa accadrà quando non scrivo 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; 
} 

Quando a b nuovamente, essa stampa 0+-1218170892=-1218170892 (Perché non è 0+0=0 ??)

+0

all'ingresso dovrebbe essere un numero intero, non un personaggio. Inserire "a", "3.141" o "qualunque" semplicemente non è valido. Se il tuo input è "a", il programma non sa che hai usato "a" come variabile e che invece vuoi usare il valore predefinito. – stefan

+0

È ovvio che sia C++ 11, perché altrimenti i valori sarebbero 1 e 2, non 0. – Drise

+0

Per rispondere alla modifica: non è stata rimossa una dall'input. Hai bisogno di 'cin.clear(); cin.ignore (1); ', in modo che la seconda estrazione abbia successo. – Drise

risposta

1

Come tutti istreams, std::cin ha bit di errore. Questi bit sono impostati quando si verificano errori. Ad esempio, è possibile trovare i valori dei bit di errore con funzioni come good(), bad(), eof(), ecc. Se si legge input non valido (fail() restituisce true), utilizzare clear() per cancellare le bandiere. Probabilmente avrai anche bisogno di un ignore(1); per rimuovere il personaggio incriminato.

Vedere la sezione State functions per ulteriori informazioni. http://en.cppreference.com/w/cpp/io/basic_ios

+0

Grazie. Ma mi sto chiedendo perché il valore di a e b diventino entrambi 0 – user1668903

+0

Se si legge un input errato, 'bad()' restituirà comunque false; è 'fail()' che restituirà true. E la pagina che citi viene ingannevolmente semplificata, e semplicemente sbagliata rispetto a 'good()' (che può restituire false anche se non si è verificato alcun errore). Buttalo fuori e trova qualcosa di meglio. –

+0

Sembra che stiate usando C++ 11: * Se l'estrazione fallisce, zero viene scritto in valore e viene impostato failbit. ** (dal C++ 11) ***. – Drise

0

std :: cin è un'istanza istream e quindi mantiene il suo stato di errore quando legge qualcosa di non valido.

Al fine di "cura" che è necessario sia per chiarire la sua bandiera

std::cin.clear(); 

e lavare il suo buffer.

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

Che cosa è più sorprendente però è che non restituisce 1 + 2 = 3, quando si immettono i caratteri non validi, come ci si aspetta un flusso cin non riuscendo ad avere effetti collaterali su ciò che si sta tentando di aggiornare .

+1

OP sta usando C++ 11: * Se l'estrazione fallisce, zero viene scritto in valore e viene impostato failbit. ** (dal C++ 11) *** – Drise

+0

È proprio questo il caso degli ints, o è una regola generale per i tipi di utenti che se lo streaming non riesce, l'oggetto dovrebbe tornare al suo stato predefinito? Penso sempre che lo streaming in un oggetto sia una logica imperfetta. Le fabbriche creano oggetti con i dati letti dagli stream, gli oggetti non vengono trasmessi in streaming .. – CashCow

+0

"* lo streaming in un oggetto è una logica imperfetta Le fabbriche creano oggetti con i dati letti dagli stream, gli oggetti non vengono trasmessi in streaming in *" - streaming con 'operator <<' è necessariamente in oggetti preesistenti (dato il parametro by-reference), e anche se una factory che crea un nuovo oggetto può essere abbastanza spesso desiderabile, ci sono momenti in cui non lo sarebbe (ad esempio quando si vogliono buffer e altre risorse che l'oggetto ha già riutilizzato per il valore successivo) e in che modo la "factory" crea oggetti nello stack (altamente desiderabile a meno che gli oggetti non siano polimorfici di run-time, abbiano bisogno di una durata estesa ecc.)? –

0

Il valore è impostato su zero su un errore come in C++ 11: Se l'estrazione non riesce, zero viene scritto in valore e viene impostato failbit.

Al '4' esempio, entrambi i valori sono 0 perché il buffer non e 'stato filo/eliminato, quindi la seconda lettura cin è ancora leggendo l'errore, e riceve anche un valore di 0.

Problemi correlati