2013-02-27 16 views
6

Stavo cercando di leggere dallo standard input. La prima riga è il numero di linee che leggerò. Le righe che ho letto successivamente verranno stampate di nuovo. Ecco il codice:cin.get() in un ciclo

#include <iostream> 

using namespace std; 

int main() 
{ 
    int n; 
    cin >> n; 
    for (unsigned int i = 0; i < n; ++i) 
    { 
     char a[10]; 
     cin.get (a, 10); 
     cout << "String: " << a << endl; 
    } 
    return 0; 
} 

Quando lo eseguo e fornisco il numero di righe, il programma termina. Non ho capito cosa sta succedendo, quindi ho deciso di chiedere qui.

Grazie in anticipo.

+0

Non penso che si dovrebbe comportare come dici tu ... ancora una volta. –

+0

riprovato - stesso bug –

risposta

6

ingressi misti formattato e non formattato è pieno di problemi. Nel vostro caso particolare, questa linea:

std::cin >> n; 

consuma il numero digitato, ma lascia il '\n' nel flusso di input.

Successivamente, questa linea:

cin.get (a, 10); 

consuma dati (perché il flusso di input punta ancora a '\n'). La prossima chiamata non consuma dati per gli stessi motivi e così via.

La domanda diventa quindi "Come si consuma il '\n'?" Ci sono un paio di modi:

Si può leggere un carattere e buttarlo via:

cin.get(); 

Si potrebbe leggere una riga intera, indipendentemente dalla lunghezza:

std::getline(std::cin, some_string_variable); 

Si potrebbe ignorare la resto della riga corrente:

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

Come un po 'di consigli correlati, non avevo mai utilizzare std::istream::get(char*, streamsize). Preferirei sempre: std::getline(std::istream&, std::string&).

+0

grazie, che ha funzionato –

2

L'aggiunta di un cin.get() prima del cin.get(a, 10) risolverà il problema perché leggerà la restante endline nel flusso di input.

+0

grazie, che ha aiutato –