cin >> string liest nicht end-of-line
-
Hallo zusammen !
Versuche mir gerade C++ beizubringen, mit Hilfe des Buches "C++ Primer" von Lippman.
Dort gibt es die Aufgabe mit <string> und <vector> ein Programm zu schreiben, dass einen Satz einliest und dann die Wörter einzeln in Zeilen ausgibt.
Das Problem ist dass das Programm nach Eingabe des Satzes (mit [ENTER]) weiter auf eine Eingabe warten. (Benutze Visual Studio 2008 EE mit Standardeinstellung).
______________________________________________________________________________#include <iostream> #include <vector> #include <string> using namespace std; int main() { vector<string> sz; string skette; cout << "Bitte geben Sie einen Satz ein: " << endl; while(cin >> skette ) { // if (skette == "x") break; (momentane Notlösung) sz.push_back(skette); } for(vector<string>::size_type i = 0; i < sz.size(); ++i) { cout << sz[i] << "\n" <<endl; } return 0; }_______________________________________________________________________________
Habe es auch mit " while(getline(cin, skette)) " versucht, ohne Erfolg.
Wie kann man das elegant lösen ?
-
wie ist die abbruchbedingung der while schleife?
vielleicht fragst du nach ob skette existiert (leer ist).
/pseudo
if skette - break
/pseudo
wie, das findest du selber heraus.
die schleife hat keinen grund abzubrechen, also tut sie es auch nicht.
-
Hmm, ich habe folgende Bedingungen ausprobiert :
if (skette == "") break;
if (skette == "\eof") break;Klappt alles nicht. Kann man [ENTER] irgendwie als Wort lesen und in der Bedingung prüfen ?
-
EibohphobiE schrieb:
Wie kann man das elegant lösen ?

es ist jedenfalls gar nicht so einfach, schon gar nicht für einen Anfänger. Folgende Funktion 'eol()' liefert die Information, ob die Zeile zu Ende ist:
#include <iostream> #include <vector> #include <string> using namespace std; bool eol( std::istream& in ) // liefert 'true' falls '\n' (LF) folgt, und konsumiert es { std::streambuf* sb = in.rdbuf(); if( !sb ) return false; // stream ist 'bad' -> kein LF typedef std::istream::traits_type traits_type; const std::ctype< char >& ct_ = use_facet< std::ctype< char > >( in.getloc() ); for( std::istream::int_type m = sb->sgetc(); !traits_type::eq_int_type( m, traits_type::eof() ) ; m = sb->snextc() ) { const char c = traits_type::to_char_type( m ); if( m == '\n' ) { sb->sbumpc(); // LF konsumieren return true; } if( !ct_.is( std::ctype_base::space, c ) ) return false; // nicht Space Zeichen folgt } return false; // EOF } int main() { vector< string > sz; cout << "Bitte geben Sie einen Satz ein: " << endl; for( string skette; !eol( cin ) && cin >> skette; ) { sz.push_back(skette); } for( vector<string>::size_type i = 0; i < sz.size(); ++i ) { cout << sz[i] << "\n" <<endl; } return 0; }Gruß
Werner
-
-
Hallo!
Die Konstruktion
while (cin >> skette) { //... }hat schon ihren Sinnn. Die Eingabe wird dann abgebrochen, wenn ein Dateiende erreicht ist oder ein ungültiger Wert für die Variable skette Eingegeben wird.
Ist skette z.B. eine Integer-Variable würde die Eingabe von Buchstaben zum Abbruch führen. Ist skette aber wie in deinem Beispiel ein string, so ist es doch recht "schwierig" eine ungültige Eingabe herbeizuführen.

Du kannst die Schleife z.B. mit der Eingabe von EOF (Strg + Z in Windows, Strg + D in Unix) beenden.
Gruß
//Edit: Nur kleine Korrekturen

-
ob ein anfänger salomons lösung versteht ist eine andere frage.
-
Ja, Salomons Lösung versteh ich wirklicht nicht, noch nicht
. Aber danke für die schnellen Antworten. Mit dem Strg-Z funktioniert es vorerst ganz gut und werde mal die nächsten Übungen mit Iteratoren versuchen, vielleicht findet sich ja da eine Lösung.Falls trotzdem noch jemand eine Idee hat wie ich eine einfache Abbruchbedingung schreiben kann , immer her damit 
-
Was gefällt Dir denn an der 'getline'-Lösung nicht?
int main() { string line; if (!getline(cin, line)) return 1; stringstream words; words << line; string word; while (words >> word) cout << word << endl; }Mit den <algorithm>-Funktionen (
copy…) geht's noch ein wenig schicker aber diese Lösung ist doch schonmal wunderbar für den Anfang.
-
Kyuss77 schrieb:
Klappt alles nicht. Kann man [ENTER] irgendwie als Wort lesen und in der Bedingung prüfen ?
ja kann man, such mal nach einer ascii tabelle (sollte in jedem halbwegs guten programmier buch stehen)
da sieht man dass der buchstabe (enter) 'CR' den code 13 hat
alsochar a; a = getch(); if ( a == 13 ) //blablabla
-
ich find die lösung mit dem eof zeichen am besten. Ist halt der weg, wies bei Unix gemacht wird, einfach am ende ein eof anhängen.