2009-03-10 15 views
5

Ho notato che ogni volta che scrivo un programma che usa std::cin che se voglio che l'utente prema Invio per terminare il programma, devo scrivere due volte lo std::cin.ignore() per ottenere il comportamento desiderato. Per esempio:Perché è necessario un secondo cin.ignore()?

#include <iostream> 

int main(void) 
{ 
    int val = 0; 
    std::cout << "Enter an integer: "; 
    std::cin >> val; 

    std::cout << "Please press Enter to continue..." << std::endl; 

    std::cin.ignore(); 
    std::cin.ignore(); // Why is this one needed? 
} 

Ho anche notato che quando non sto usando cin per l'ingresso vero e proprio, ma piuttosto solo per la ignore() chiamata alla fine, ho solo bisogno di uno.

+0

Stai usando Linux o Windows, può essere causa di il problema CRLF se si sta usando Windows ... – Ben

+0

Lo stesso "problema" si verifica su Solaris. Non ha nulla a che fare con CRLF. –

risposta

8

Discl: sto semplificando quello che succede veramente.

Il primo serve a eliminare ciò che l'operatore di estrazione (>>) non ha consumato. Il secondo attende un altro \ n.

E 'esattamente la stessa cosa quando facciamo uno std :: getline dopo un'estrazione: un the_stream::ignore(std::numeric_limits<streamsize>::max(), '\n'); è richiesto prima della chiamata a std :: getline()

+3

Ah capisco. Quindi se i caratteri che inserisci al primo prompt sono "123 \ n", stai dicendo che l'operatore >>() lascia solo "\ n", e il primo ignore() lo legge; quindi il secondo ignore() attende che tu preme un tasto e legge quello (il 2 ° "\ n"). +1. –

+0

Questa è l'idea. –

0

Questo è strano. Su quale piattaforma stai correndo? Per definizione, ignore estrae e scarta n caratteri dal flusso di input o se colpisce EOF si ferma. Se non si specifica alcun parametro, viene estratto 1 carattere. Su Windows, la fine della riga comprende sia un valore \r sia uno \n: un totale di due caratteri (un ritorno a capo seguito da una nuova riga).

+0

All'inizio ho pensato anche io, ma la libreria dovrebbe astrarre qualsiasi schema di terminazione della linea che la piattaforma utilizza, e il codice dell'applicazione dovrebbe vedere solo "\ n". –

Problemi correlati