2015-09-19 10 views
6

ho questo ciclo momento che legge in numero e li emette in decimale, ottale e esadecimale:Scartare lettere eccetto numeri con 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; 
    } 
} 

Tuttavia se provo scartare input che non sono numeri con questo non leggerà l'ingresso dopo le lettere:

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

Come faccio a scartare ingresso, ma in grado di leggere altro ingresso più tardi?

ingresso del campione:

23 
678 786 abc 
7777 

Uscita prevista: Dicembre, Ottobre, hex


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

Manca una chiamata a 'cin.clear()'. Ne hai bisogno per cancellare il 'failbit'. Finché è impostato, tutte le operazioni falliscono immediatamente. –

risposta

2

Hai bisogno di consumare il contenuto incriminato da cin e ripristinare lo stato di errore. Finché è impostato failbit, tutte le operazioni di immissione falliranno immediatamente.

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

In alternativa, si può solo sempre leggere un std::string e poi cercare di analizzare che ad un numero con std::stoi:

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

Ma questo sarà probabilmente un uso eccessivo, come si eccezioni affermare che input non valido non è eccezionale Al rialzo, significa fare meno logica "a mano".

Problemi correlati