2012-08-29 13 views
9

Tak więc mam funkcję, która przeskakuje nad pierwszym getline i prosto do drugiego. Próbowałem wyczyścić bufor, ale wciąż nie miałem szczęścia, co się dzieje?getline() pomijanie pierwszego nawet po wyczyszczeniu()

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

Czy konsola mniej niż 50 znaków, szeroki? Domyślne jest 80 myślę –

Odpowiedz

10

Upewnij się, że nie użyłeś cin >> str. przed wywołaniem funkcji. Jeśli używasz cin >> str, a następnie chcesz użyć getline(cin, str), musisz wcześniej zadzwonić pod numer cin.ignore().

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

W przypadku korzystania z c-strings:

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

DODAJ: Twój źle nie jest chyba w samej funkcji, ale raczej przed wywołaniu funkcji. Strumień cin musi odczytać tylko nowy znak linii \n' w pierwszym cin.getline.

0

Po przeczytaniu czegoś w bufacie nadal znajduje się znak "RETURN", więc po każdym przeczytaniu musisz mieć cin.ignore().

Możesz również użyć cin.sync(), aby usunąć strumień. Rzeczywista czysta metoda usuwa tylko flagi.

Istnieje również opcja, że ​​możesz przejść do końca strumienia, bez niczego do przeczytania powinieneś pisać bez problemów.

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

To od Ciebie zależy, z czego będziesz korzystać.

1

cin.clear(); usuwa wszystkie bity błędów w strumieniu - nie pobiera żadnych danych, które mogą być w toku.

Chcesz użyć cin.ignore() do konsumpcji danych ze strumienia.

0

użycie cin.ignore(-1); To nie usunie pierwszego znaku ciągu wejściowego

Powiązane problemy