2012-08-29 23 views
9

Quindi ho una funzione che continua a saltare sulla prima linea e direttamente alla seconda. Ho provato a cancellare il buffer, ma ancora senza fortuna, cosa sta succedendo?getline() saltando prima anche dopo clear()

void getData(char* strA, char* strB) 
{ 
    cout << "Enter String 1: ";    // Shows this line 
    cin.clear(); 
    cin.getline(strA, 50);     // 50 is the character limit, Skipping Input 

    cout << endl << "Enter String 2: ";  // Showing This Line 
    cin.clear(); 
    cin.getline(strB, 50);     // Jumps Straight to this line 
} 
+0

? Il default è 80 penso –

risposta

10

Assicurarsi di non aver utilizzato cin >> str. prima di chiamare la funzione. Se si utilizza cin >> str e si desidera utilizzare getline(cin, str), è necessario chiamare cin.ignore() in precedenza.

string str; 
cin >> str; 
cin.ignore(); // ignores \n that cin >> str has lefted (if user pressed enter key) 
getline(cin, str); 

Nel caso di utilizzo di c-stringhe:

char buff[50]; 
cin.get(buff, 50, ' '); 
cin.ignore(); 
cin.getline(buff, 50); 

ADD: Il tuo sbagliato non è probabilmente nella funzione stessa, ma piuttosto prima chiamare la funzione. Lo stream cin deve leggere solo un nuovo carattere di linea \n' nel primo cin.getline.

0

Dopo aver letto qualcosa, è ancora presente il carattere 'INVIO' all'interno di bufor, quindi è necessario cin.ignore() dopo ogni lettura.

È inoltre possibile utilizzare cin.sync() per cancellare lo stream. Il metodo di cancellazione effettiva cancella solo i flag.

C'è anche l'opzione che si può andare alla fine del flusso, con nulla da leggere che si dovrebbe scrivere senza problemi.

std::cin.seekg(0, std::ios::end); 

Spetta a voi cosa userete.

1

cin.clear(); cancella tutti i bit di errore sul flusso: non consuma dati in sospeso.

Si desidera utilizzare cin.ignore() per consumare i dati dallo streaming.

0

uso cin.ignore(-1); Esso non rimuoverà il primo carattere della stringa di input è la console meno di 50 caratteri estesi-