2012-10-02 9 views
12

Eventuali duplicati:
Need help with getline()getline() non funziona se usato dopo alcuni input

getline() non funziona, se lo uso dopo alcuni input, cioè

#include<iostream> 
using namespace std; 

main() 
{ 
string date,time; 
char journal[23]; 


cout<<"Date:\t"; 
cin>>date; 
cout<<"Time:\t"; 
cin>>time; 

cout<<"Journal Entry:\t"; 
cin.getline(journal,23); 


cout<<endl; 
system("pause"); 
} 

dove come se io uso getline() sopra gli input, funziona cioè

cout<<"Journal Entry:\t"; 
cin.getline(journal,23); 
cout<<"Date:\t"; 
cin>>date; 
cout<<"Time:\t"; 
cin>>time; 

Quale potrebbe essere il motivo?

+1

Si prega di definire "non funziona". Quali risultati ti aspettavi e cosa hai ottenuto? –

risposta

25

personaggi vengono estratti fino a quando (n - 1) i personaggi sono stati estratto o il carattere di delimitazione viene trovato (che è delim se viene specificato questo parametro , o '\ n' altrimenti). L'estrazione si ferma anche a se viene raggiunta la fine del file nella sequenza di input o se si verifica un errore durante l'operazione di input.

Quando cin.getline() legge dall'ingresso, è presente un carattere di fine riga nel flusso di input, quindi non legge la stringa di c. Utilizzare cin.ignore() beore chiamando getline().

cout<<"Journal Entry:\t"; 
cin.ignore(); 
cin.getline(journal,23); 
+0

cosa succede a 'int' ancora' \ n' ha causato il problema di 'getline()'? – UnKnown

+0

Questa è una cosa così importante e non è menzionata in molti dei siti web che spiegano la funzionalità di getline. – ViruMax

2

Non stai controllando lo stato del flusso. L'operatore di estrazione stream std::cin (operator>>) non può riuscire. In tal caso, lo stream viene contrassegnato come "non valido" (sono impostati failbit, badbit o eofbit). Una volta "cattivo", tutte le successive estrazioni di stream su quel flusso falliranno, a meno che non si cancelli lo stato.

Impara ad essere un programmatore paranoico. Controllare sempre lo stato di quelle operazioni di input formattate. È possibile, ad esempio, lanciare un'eccezione o stampare un messaggio di errore ed uscire. L'unica cosa che non dovresti fare è semplicemente supporre che ha funzionato.

6

aggiunta a quanto detto @DavidHammen:

Le operazioni di estrazione lasciano il trascinamento '\n' carattere nel flusso. D'altra parte, istream::getline() lo scarta. Quindi, quando chiami getline dopo un operatore di estrazione, '\n' è il primo carattere che incontra e smette di leggerlo proprio lì.

Mettere questa estrazione dopo prima getline chiamata:

cin.ignore()

Un modo più robusto di prendere in ingresso sarebbe qualcosa di simile:

while (true) { 

    cout<<"Time:\t"; 
    if (cin>>time) { 
     cin.ignore(); // discard the trailing '\n' 
     break; 
    } else { 
     // ignore everything or to the first '\n', whichever comes first 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cin.clear(); // clear the error flags 
     cout << "Invalid input, try again.\n"; 
    } 
} 
Problemi correlati