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

wenn ich eingeben 3 4 als Eingabe, wird der Ausgang 3+4=7 sein, na ja, es ist seltsam; Aber wenn ich a b eingeben, ist der Ausgang 0+0=0 (Warum ist es 0 und 0?); Die meisten verwirrend, a 4, wird es 0+0=0 sein (Warum nicht '0 + 4 = 4' ?????); Dann schreibe ich ein anderes prog.Was ist cin tun, wenn es ein Fehler

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

Wenn ich a 4 eingeben, warum ist es 0+0=0 noch? Sollte es nicht 0+4=4 sein?

Danke an alle warmherzigen !!

Ich schreibe Prog3, um zu testen, was passieren wird, wenn ich nicht schreibe 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; 
} 

Wenn a b wieder, es gibt 0+-1218170892=-1218170892 (Warum nicht 0+0=0 ist ??)

+0

der Eingang Es wird erwartet, dass es sich um eine Ganzzahl und nicht um ein Zeichen handelt. Die Eingabe von "a", "3.141" oder "was auch immer" ist einfach nicht gültig. Wenn Ihre Eingabe "a" ist, weiß das Programm nicht, dass Sie "a" als Variable verwendet haben und stattdessen den Standardwert verwenden möchten. – stefan

+0

Es ist offensichtlich, dass es C++ 11 ist, weil sonst die Werte 1 und 2 wären, nicht 0. – Drise

+0

Um Ihre Bearbeitung zu beantworten: Sie haben kein von der Eingabe entfernt. Du brauchst 'cin.clear(); cin.ignore (1); ', damit die zweite Extraktion erfolgreich ist. – Drise

Antwort

1

Wie alle istreams hat std::cin Bits Fehler. Diese Bits werden gesetzt, wenn Fehler auftreten. Zum Beispiel können Sie die Werte der Fehlerbits mit Funktionen wie good(), bad(), eof() usw. finden. Wenn Sie eine schlechte Eingabe lesen (fail() gibt true zurück), verwenden Sie clear(), um die Flags zu löschen. Sie werden wahrscheinlich auch eine ignore(1); benötigen, um das störende Zeichen zu entfernen. Weitere Informationen finden Sie unter State functions. http://en.cppreference.com/w/cpp/io/basic_ios

+0

Danke. Aber ich frage mich, warum der Wert von a und b beide 0 – user1668903

+0

werden Wenn Sie schlechte Eingabe lesen, wird 'bad()' immer noch falsch zurückgeben; es ist 'fail()', das wahr zurückgibt. Und die Seite, die du anführst, ist irreführend vereinfacht und einfach falsch in Bezug auf 'good()' (die auch dann false zurückgeben kann, wenn kein Fehler aufgetreten ist). Wirf es raus und finde etwas Besseres. –

+0

Sie scheinen C++ zu verwenden 11: * Wenn Extraktion fehlschlägt, wird Null in Wert geschrieben und Failbit festgelegt. ** (seit C++ 11) ***. – Drise

0

std :: cin ist eine istream-Instanz und behält daher seinen Fehlerstatus bei, wenn etwas Ungültiges gelesen wird.

Um zu „heilen“ es müssen Sie seine Flagge beide löschen

std::cin.clear(); 

und seinen Puffer spülen.

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

Was allerdings noch überraschender ist, dass es nicht 1 zurückkehrt + 2 = 3, wenn Sie Eingabe ungültige Zeichen, wie ich einen Fehler cin Strom keine Nebenwirkungen auf haben würde erwarten, was es versucht, zu aktualisieren .

+1

OP verwendet C++ 11: * Wenn die Extraktion fehlschlägt, wird Null in den Wert geschrieben und failbit gesetzt. ** (seit C++ 11) *** – Drise

+0

Ist dies nur bei Ints der Fall oder ist es eine allgemeine Regel für Benutzertypen, dass das Streaming in den Standardzustand zurückkehrt, wenn das Streaming fehlschlägt? Ich denke immer, dass das Einströmen in ein Objekt eine fehlerhafte Logik ist. Fabriken erzeugen Objekte mit Daten, die von Streams gelesen werden, Objekte werden nicht in Streams gesandt. – CashCow

+0

"* Streaming in ein Objekt ist fehlerhafte Logik. Factories erstellen Objekte mit Daten, die aus Streams gelesen werden, Objekte werden nicht in * gestreamt - Streaming mit 'operator <<' ist notwendigerweise in bereits existierende Objekte (gegeben durch den Referenz-Parameter), und obwohl eine Fabrik, die ein neues Objekt erzeugt, ziemlich oft wünschenswert sein kann, gibt es Zeiten, in denen dies nicht der Fall wäre (zB wenn Sie Puffer und andere Ressourcen, die das Objekt bereits für den nächsten Wert wiederverwendet hat) und wie würde die "Fabrik" Objekte auf dem Stapel erzeugen (sehr wünschenswert, es sei denn, die Objekte sind Laufzeit-polymorph, benötigen eine längere Lebensdauer usw.)? –

0

Der Wert wird bei einem Fehler gemäß C++ 11 auf Null gesetzt: Wenn die Extraktion fehlschlägt, wird Null auf Wert geschrieben und Failbit wird gesetzt.

Am ‚4‘ Beispiel sind beiden Werte 0, da der Puffer flush/nicht gelöscht wurde, so dass die zweite cin liest noch die Fehler zu lesen, und empfängt auch ein Wert von 0.