Problem mit cin und cin.getline()
-
Skym0sh0 schrieb:
vor das ignore muss das cin.clear();
dann sollte es klappen
Aber vor dem ignore ist doch ein cin.clear();
cin>>menue; cin.clear(); //Eingabefehler von cin aufheben cin.ignore(cin.rdbuf()->in_avail()); //Eingabefehler von cin aufheben switch(menue) { case 1:
-
mtepe schrieb:
Wenn ich an Stelle von cin.ignore(1); den Befehl cin.ignore(cin.rdbuf()->in_avail()); nutze kommt es weiterhin zu Fehler.
Definiere Fehler. Wo? Was? Wie? Wann?
Dein kompletter Code hat schliesslich nichts mit dem ersten gezeigten zu tun. Wenn du meine Lösung im ersten Code einfügst, dann funktioniert dieser.
Grüssli
-
Dravere schrieb:
Definiere Fehler. Wo? Was? Wie? Wann?
Wenn ich den zweiten Code ausführe, in dem ich nach einem cin ein cin.clear(); und ein cin.ignore(cin.rdbuf()->in_avail()); kommt es zu folgende Verhalten im Programm:
Wähle ich z.B die 1 zum anlegen eines neuen Eintrag, so wird die Eingabe des Vornamen übersprungen.
Wähle ich hingegen z.B ein e so fängt das ganze Programm an zu blinken und lasst sich nicht mehr unterbrechen.Dravere schrieb:
Dein kompletter Code hat schliesslich nichts mit dem ersten gezeigten zu tun
Sorry, der erste Code ist auch ein Teil des Programm. Er ist am Anfang vom zweiten Code eingebunden.
#include "nummereingabe.h"
Hab ich wohl vergessen zu erwähnen
-
Hab den Code übernommen und getestet.
Alle FunktionenprogrammKopf
undwarten
rausgestrichen, da ich diese nicht kenne, und habe den Fehler korrigiert, welcher Werner aufgezeigt hat.
Bei mir lief es einwandfrei und konnte die Probleme nicht reproduzieren, welche du aufgezeigt hast.Hast du auch alles richtig umgesetzt? Was passiert in
programmKopf
undwarten
? Welchen Kompiler und welche Standardbibliothek benutzt du?Grüssli
-
Dravere schrieb:
Gelesen wird aber nur die Zahl und der Line Feed bleibt im Stream. Wenn du nun eine ganze Zeile auslesen willst, kommt nichts, da die Zeile gleich beendet ist, wegen dem Line Feed.
Das gilt für get, aber nicht für getline.
-
KasF schrieb:
Dravere schrieb:
Gelesen wird aber nur die Zahl und der Line Feed bleibt im Stream. Wenn du nun eine ganze Zeile auslesen willst, kommt nichts, da die Zeile gleich beendet ist, wegen dem Line Feed.
Das gilt für get, aber nicht für getline.
Das gilt auch für den
operator >>
und darauf hatte ich mich bezogen, nicht aufgetline
getline
holt eine leere Zeile, weil nicht gesäubert wurde nach demoperator >>
.Grüssli
-
Ich muss sagen, dass ich dieses Problem auch habe(wenn ich die Beschreibungen nicht alle vollständig missverstanden habe).
Folgender Code pausiert am Ende nämlich nicht:#include <iostream> using namespace std; int main() { int var; cin >> var; cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); }
Ich habe stattdessen immer die etwas schlechtere Variante verwendet:
#include <iostream> #include <limits> using namespace std; int main() { int var; cin >> var; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cin.get(); }
-
Dravere schrieb:
Das gilt auch für den
operator >>
und darauf hatte ich mich bezogen, nicht aufgetline
Ohh, sorry.
-
programmKopf.cpp
/*************************************************************************** Versionsanzeige ***************************************************************************/ #include <iostream> #include <cstdlib> using namespace std; void programmKopf(int index) { system ("clear"); cout<<"Telefonbuch v0.1"<<endl; cout<<index<<" von 100 Einträge belegt."<<endl; cout<<'\n'; }
warten.cpp
/*************************************************************************** Warten auf Bestätigung ***************************************************************************/ #include <iostream> #include <cstdlib> using namespace std; void warten(){ cout<<'\n'<<"Weiter mit Eingabetaste."<<endl; char enter[1]; cin.getline(enter,1); }
Wie bekomme ich den Compiler und die Standardbibliothek heraus?
Ich glaub mit Compiler ist der GCC gemeint?
Dann wäre es folgender:matthias@laptop:~$ gcc --version gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3) Copyright (C) 2007 Free Software Foundation, Inc. Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es gibt KEINE Garantie; auch nicht für MARKTGÄNGIGKEIT oder FÜR SPEZIELLE ZWECKE.
-
Dann muss ich sagen, dass ich keine Ahnung habe, wieso es nicht geht, sofern du alles richtig umgesetzt hast, was wir dir gesagt haben.
Oder ich sehe den Fehler nicht. Jedenfalls läuft es bei mir einwandfrei.Probier vielleicht noch die folgenden Zwei Dinge aus. Statt der Linie:
std::cin.ignore(std::cin.rdbuf()->in_avail());
Schreib entweder diese hin:
std::cin.sync();
Oder diese hier:
#include <limits> // <- für std::numeric_limits nötig. // ... std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Grüssli
-
JustAnotherNoob schrieb:
Ich habe stattdessen immer die etwas schlechtere Variante verwendet:
Wieso schlechtere ?
Ich hatte schonmal die Problematik mit dem in_avail() angesprochen: http://c-plusplus.net/forum/viewtopic-var-p-is-1300629.html
-
cin>>menue; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n');
Funktioniert wunderbar
DANKE !!!
Aber was genau passiert denn da jetzt?
Das Zeichen \n wird ignoriert. Ok macht Sinn.
streamsize??? wird ignoriert wenn > numeric_limits bzw <::max()Was sind streamsize, numeric_limits und was ist ::max() ???
-
mtepe schrieb:
cin>>menue; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n');
Funktioniert wunderbar
DANKE !!!
Aber was genau passiert denn da jetzt?
Das Zeichen \n wird ignoriert. Ok macht Sinn.
streamsize??? wird ignoriert wenn > numeric_limits bzw <::max()Was sind streamsize, numeric_limits und was ist ::max() ???
Es werden alle Zeichen im weggeworfen, die entwerder bis zu nächsten '\n' gehen (also bis zum nächsten Return), oder, falls kein '\n' im Stream ist, wird alles bis zur maximalen Streamgröße weggeworfen.
Wenn der Stream allerdings leer ist (in Deinem Fall unwahrscheinlich), dann blockiert der Aufruf von ignore allerdings, bis irgendwas in den Stream geschrieben wird.
Das Leerräumen von Input-Streams ist unter C++ leider alles andere als einfach. Im Grunde genommen ist das sogar ziemlich scheisse, weil es nur wenige Lösungen gibt, die wirklich portabel sind.Eine recht gute Zusammenfassung zu dem Thema gibt es hier.