2015-09-19 14 views
6

Ich habe diese Schleife jetzt, dass in Zahlen liest und gibt sie in dezimal, oktal und hexadezimal:Wegwerfen Buchstaben außer Zahlen mit cin

while(1) { 
    if (cin >> n) 
    cout << internal << setfill(' ') << setw(10) << dec << n << internal << setw(12) << oct << n << internal << setw(9) << hex << uppercase << n << endl; 
    if (cin.fail()) { 
     break; 
    } 
} 

Allerdings, wenn ich versuche, Eingaben zu verwerfen, die keine Zahlen sind mit Dies wird nicht in der Eingabe nach den Buchstaben gelesen:

if (cin.fail()) { 
    cin.ignore(); 
} 

Wie verwerfe ich Eingang, aber in der Lage, andere Eingabe später zu lesen?

Probe Input:

23 
678 786 abc 
7777 

Erwartete Ausgabe: Dezember, Oktober, hex


23   27  17 
    678  1246  2A6 
    786  1422  312 
    7777  17141  1E61 
+0

Sie verpassen einen Aufruf von 'cin.clear()'. Sie brauchen das, um das Failbit zu löschen. Solange es eingestellt ist, schlagen alle Operationen sofort fehl. –

Antwort

2

Sie müssen den anstößigen Inhalt von cin und setzen Sie den Fehlerzustand verbrauchen. Solange failbit eingestellt ist, werden alle Eingabeoperationen sofort fehlschlagen.

while(1) { 
if (cin >> n) 
    cout << internal << setfill(' ') << setw(10) << dec << n << internal << setw(12) << oct << n << internal << setw(9) << hex << uppercase << n << endl; 
else { 
    if (cin.eof()) 
     break; 
    cin.clear();    // Reset the error state 
    std::string dummy; 
    if (!(cin >> dummy))  // Consume what ever non-integer you encountered 
     break; 
    } 
} 

Alternativ können Sie nur lesen immer ein std::string und dann versuchen, dass mit std::stoi zu einer Zahl zu analysieren:

for (std::string word; std::cin >> word;) { 
    try { 
     int n = std::stoi(word); 
     // You output logic here 
    } 
    catch (std::exception&) {} 
} 

Aber das wird wahrscheinlich übermäßigen Gebrauch Ausnahmen, wie Sie, dass ungültige Eingabe angeben ist nicht außergewöhnlich. Auf der Oberseite bedeutet es, weniger Logik "von Hand" zu machen.

Verwandte Themen