Das Problem mit Double/Int und STring
-
Hallo Leute

Ich bin ziemlich neu beim Programmieren mit C++ und arbete im Moment mit Konsolenanwendungen

ich bin da lich auf mein erstes Problem gestoßen:
Wenn man mit cin eine eingabe macht und die gespeichert wird, muss man die Variabe, in der das gespeichert wird, da definieren,Wen ich jetzt aber z.B. A (Variable) mit double definiere, der USer aber einen Buchstaben eingibt, buggt das Programm...
Wie kann ich das Problem umgehen? Wie kann ich also eine Errormessage senden, wenn der User statt einer Zahl einen Buchstaben eingibt?Danke für eure Hilfe

-
Jetzt stellt sich die Frage: Wie holst Du die Eingabe denn von Benutzer?
Ich verschiebe mal, denn es scheint mir keine MFC Frage zu sein.
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ein Programm das bestimmte Filter lädt
Indem fehlerhafte Eingaben abfangen werden, bevor sie nach double konvertiert werden.
-
Wenn die Leseoperationen fehlschlagen (z.B. wegen dem Buchstaben bei double. Bei int aber auch!), dann wird der Stream (hier cin) in einen Fehlerzustand versetzt. Das heißt, alle weitere Aktionen schlagen fehl, so lange du dich nicht darum kümmerst.
Du kannst den Fehlerzustand feststellen, in dem du einfach das Streamobjekt selber auswertest, also z.B.if (cin) // alles in OrdnungDas lässt sich natürlich auch mit der Eingabeoperation direkt kombinieren, denn (fast) alle Eingabefunktionen geben wieder den Stream zurück:
if (!(cin >> zahl)) // Eingabe fehlgeschlagenDies lässt dann auch die sehr praktische Schreibweise zu, wie man eine unbekannte Zahl Werte nacheinander einlesen kann:
while (cin >> zahl) { // Alles in Ordnung, zahl verarbeiten } // Leseaktion fehlgeschlagen (normalerweise Dateiende), beende Schleife(gerne auch mit anderen Schleifenkonstruktionen, bloß um dir mal die Idee zu geben)
Mit good, bad, eof und ähnlichen Funktionen kann man übrigens auch genauer herausfinden, was überhaupt passiert ist, um einen Fehler auszulösen.
Wie geht man nun mit einem Fehler um? Bevor man irgendetwas weiteres auf dem Stream machen kann, muss man zuerst einmal clear() auf ihm aufrufen. Danach ist aber das, was den Fehler ausgelöst hat, immer noch im Stream, man kann also nicht einfach versuchen, nochmals zu lesen. Viele Leute setzen hier auf
ignore(1)(ein Zeichen überspringen) oderignore(std::numeric_limits<std::streamsize>::max(), '\n')(alles bis zum nächsten Zeilenumbruch überspringen, benötigt den Headerlimits). Ich bin eigentlich kein so großer Fan von beidem, weil man versucht mit dem C++-Eingabemodell eine Konsolenoberfläche nachzubauen, die es aber nicht ist. Musst du wissen, was für dich das richtige ist.
-
int main() { double a; while (!(std::cin >> a)) { std::cin.clear(); // Löscht den Fehlerstatus // Nicht passende Daten nicht aus dem Puffer genommen werden // ignorieren wir eine Zeile. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "ICH WILL EINE ZAHL, VERSTEH ES DOCH!!11!1!\n"; } }Edit: Argh, meine Quote war so gut zuletzt!
