Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.04.2012, 15:33

Fehlerhafte Werteingabe

Hallo Leute,
wie ihr an meinem Beitragszähler seht, bin ich neu im Forum.
Ich habe vor recht kurzer Zeit mit der Programmierung in C++ angefangen, als Lehrbuch dient mir hierbei Einführung in die Programmierung mit C++ von Bjarne Stroustrup (ein Buch, das ich nur weiterempfehlen kann!).
Allerdings bin ich momentan mit der Lösung einer Übungsaufgabe beschäftigt, und dabei bin ich auf ein Problem gestoßen, dass ich nicht erklären bzw. lösen kann:
wenn ich einen Wert einlese, und überprüfe, ob die Eingabe fehlerhaft ist, bricht das Programm nach Ausgabe von "Fehlerhaft Eingabe!" ab, ohne den restlichen Code auszuführen.
Hier eine vereinfachte Version des Quellcodes, in dem der Fehler auftritt:

C-/C++-Quelltext

1
2
3
4
5
6
7
 int a;
    cin >> a;
    if (!cin)
    {
        cerr << "Fehlerhafte Eingabe!\n";
    }
    keep_window_open(); 


Die Funktion keep_window_open() sieht folgendermaßen aus:

C-/C++-Quelltext

1
2
3
 inline void keep_window_open(){
    char ch;
    cin >> ch; } 


Wie gesagt, wenn ich z. B. einen Buchstaben eingebe, dann schließt sich das Programmfenster. Bei einer Zahl wird die Funktion keep_window_open() ausgeführt.
Was habe ich für einen Fehler gemacht?
Vielen Dank im Voraus!

FSA

Community-Fossil

  • Private Nachricht senden

2

21.04.2012, 17:21

Das liegt an cin. Ich persönlich weiß selbst nicht wieso das so ist, aber schreibe bei deiner keep_window_open-Funktion statt cin getch(); Musst dann noch die Conio.h einbinden.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

21.04.2012, 17:28

Es wird daran liegen, dass im Eingabestream noch ein zeichen ist.
Um es zu ignorieren musst du die Methode cin.ignore() aufrufen. Ausserdem empfehle ich cin.get(). Dafür brauchst du auch keinen extra char. :D

C-/C++-Quelltext

1
2
3
4
5
inline void keep_window_open()
{
cin.ignore();
cin.get();
}


Falls du cin danach noch nutzen willst, solltest du auch noch cin.clear aufrufen. Dadurch werden die fehlerflags gelöscht.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

4

21.04.2012, 17:53

Danke für die Antworten!
Zumindest die Methode von FSA funktioniert, allerdings wird mit dem Code

C-/C++-Quelltext

1
2
3
cin.ignore();
cin.get();
cin.clear();

von NachoMan auch weiterhin nach der Ausgabe von "Fehlerhafte Eingabe!" beendet.
Aber ich will mich nicht beschweren, danke, dass ihr zwei mir weitergeholfen habt! :)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

21.04.2012, 18:18

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

Die Lösung von FSA funktioniert in dem Fall zwar. Aber wenn du cin danach noch benutzt gibts Probleme.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (21.04.2012, 18:24)


Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

6

21.04.2012, 21:04

Das cin.clear() an den anfang (auch vor NachoMans Vorschlag)!

7

21.04.2012, 21:51

Hm, also mit dieser Lösung:

C-/C++-Quelltext

1
2
3
cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cin.get();

spuckt mir der Compiler ein 5 Fehlermeldungen aus:

Fehler 1: error C2039: 'numeric_limits': Ist kein Element von 'std'
Fehler 2: error C2065: 'numeric_limits': nichtdeklarierter Bezeichner
Fehler 3: error C2275: 'std::streamsize': Ungültige Verwendung dieses Typs als Ausdruck
Fehler 5: error C2780: 'const _Ty &std::max(const _Ty &,const _Ty &)': Erwartet 2 Argumente
Fehler 4: error C2780: 'const _Ty &std::max(const _Ty &,const _Ty &,_Pr)': Erwartet 3 Argumente - 0 unterstützt

Ich habe jetzt wahrscheinlich einen total dummen Fehler gemacht, oder einen von Euch falsch verstanden, aber zumindest mit meinem aktuellen Wissenstand (ich weiß ja noch nicht mal, was der Code den ihr mir empfohlen habt bedeutet ;) ), wüsste ich nicht, was ich da falsch gemacht habe...
Viele Grüße

8

21.04.2012, 21:53

Da werden Header Fehlen (= includes vergessen). Versuch mal selber herauszufinden, welche es sind, ist ne gute Übung.
Lieber dumm fragen, als dumm bleiben!

9

21.04.2012, 22:19

Ja, daran lag es. limits.h hat gefehlt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

21.04.2012, 22:28

Richtig ist nur <limits>, nicht <limits.h> ;)

Werbeanzeige