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.


  • Mod

    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 Ordnung
    

    Das 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 fehlgeschlagen
    

    Dies 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) oder ignore(std::numeric_limits<std::streamsize>::max(), '\n') (alles bis zum nächsten Zeilenumbruch überspringen, benötigt den Header limits ). 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! 😋


Anmelden zum Antworten