2013-02-27 5 views
6

Ich habe versucht, von der Standardeingabe zu lesen. Die erste Zeile ist die Anzahl der Zeilen, die ich lesen werde. Die Zeilen, die ich als nächstes gelesen habe, werden erneut gedruckt. Hier ist der Code:cin.get() in einer Schleife

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

Wenn ich es ausführen und die Anzahl der Zeilen geben, wird das Programm beendet. Ich habe nicht herausgefunden, was vor sich geht, also habe ich beschlossen, es hier zu fragen.

Vielen Dank im Voraus.

+0

Ich glaube nicht, dass es sich so verhalten sollte, wie du es sagst ... noch einmal. –

+0

noch einmal versucht - derselbe Fehler –

Antwort

6

Mischformatierte und unformatierte Eingabe mit Problemen behaftet ist. In Ihrem speziellen Fall, diese Zeile:

std::cin >> n; 

verbraucht die Zahl, die Sie eingegeben haben, lässt aber die '\n' in dem Eingangsstrom.

Anschließend wird diese Zeile:

cin.get (a, 10); 

verbraucht keine Daten (da der Eingangsstrom bei '\n' zeigt noch). Der nächste Aufruf verbraucht aus den gleichen Gründen auch keine Daten und so weiter.

Die Frage wird dann, "Wie verzehre ich die '\n'?" Es gibt ein paar Möglichkeiten:

Sie ein Zeichen lesen kann und werfen es weg:

cin.get(); 

Sie eine ganze Zeile lesen konnte, unabhängig von der Länge:

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

Sie das ignorieren könnte Rest der aktuellen Zeile:

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

Als wenig verwandten Beratung, würde ich nie verwenden std::istream::get(char*, streamsize). Ich würde immer bevorzugen: std::getline(std::istream&, std::string&).

+0

danke, das hat funktioniert –

2

Das Hinzufügen eines cin.get() vor cin.get(a, 10) wird Ihr Problem lösen, weil es die verbleibende Endzeile im Eingabestream liest.

+0

danke, das hat geholfen –