2013-02-27 24 views
6

Próbowałem odczytać ze standardowego wejścia. Pierwsza linia to liczba linii, które przeczytam. Linie, które przeczytam dalej, zostaną wydrukowane ponownie. Oto kod:cin.get() w pętli

#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; 
} 

Po uruchomieniu i podaniu liczby linii program zostaje zamknięty. Nie zorientowałem się, co się dzieje, więc postanowiłem zapytać o to tutaj.

Z góry dziękuję.

+0

Nie sądzę, że powinien zachowywać się tak, jak mówisz .. jeszcze raz. –

+0

spróbował jeszcze raz - ten sam błąd –

Odpowiedz

6

Mieszanie wejście sformatowany i niesformatowany jest obarczona problemami. W danym przypadku, ta linia:

std::cin >> n; 

zużywa liczby wpisane, ale pozostawia '\n' w strumieniu wejściowym.

Następnie ta linia:

cin.get (a, 10); 

zużywa żadnych danych (ponieważ strumień wejściowy jest nadal wskazując na '\n'). Następna inwokacja również nie pochłania żadnych danych z tych samych powodów i tak dalej.

Pytanie brzmi: "Jak mogę spożywać '\n'?" Istnieje kilka sposobów:

można przeczytać jeden znak i wyrzucić:

cin.get(); 

Mogłeś przeczytać jedną całą linię, niezależnie od długości:

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

Można zignorować Reszta z bieżącej linii:

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

Jako trochę pokrewnej porady, nigdy nie użyłbym std::istream::get(char*, streamsize). Zawsze wolałbym: std::getline(std::istream&, std::string&).

+0

dziękuję, to zadziałało –

2

Dodanie cin.get() przed cin.get(a, 10) rozwiąże problem, ponieważ odczyta pozostałą linię końcową w strumieniu wejściowym.

+0

dzięki, że pomogło –