Exception 1. Versuche
-
afaik wirft atoi keine Exception wenn es fehl schlägt?!
Bzw. wo liegt eigentlich das Problem? Deinem Posting fehlt ein Fragezeichen.
MfG SideWinder
-
Ich seh nirgends eine throw-Anweisung und auch sonst nichts, was eine Exception werfen könnte. Lies dir die Dokumentation von atoi nochmal durch.
-
ja genau danach suche ich ja. wenn jemand einen buchstabem beim alter eingibt dann soll eine exception starten. aber ich weiß net so genau wie! im borland war das hier prinzipiell schon alles, da gibs sowas wie throw nicht so richtig!
-
atoi ist C und C kennt (meines Wissens, korrigiert mich) keine Exceptions. Das kannst du mit Stringstreams lösen, das wirft dann eine Exception.
-
thx, mehr wollte ich doch gar net wissen. vielen dank.
-
Artchi schrieb:
Das kannst du mit Stringstreams lösen, ...
Ja.
Artchi schrieb:
... das wirft dann eine Exception.
Nein.
-
evtl. solltest du dir auch mal überlegen, was das Wort "exception" bedeutet:
Ausnahme.
Sowas sollte also nur in den Fällen benutzt werden, die wirklich Ausnahmen darstellen und im Normalfall nicht vorkommen (wundersames Verschwinden wichtiger Dateien etc.)
Die Fehleingabe eines Users wie in diesem Fall würde ich eher nicht dazu zählen...
-
Ja, und ein Alpha in einem Numericblock ist eine Ausnahme. Es ist schon korrekt was der Topicersteller will.
-
Stringstreams werfen keine Exceptions, das heist keine mit der Ausnahme, dass man sie explicit mit ios::exceptions einschaltet. Die Stringstreams sind nur bedingt für Convertirungen geeignet. Das Abfragen des Failbits nach der Lese Operation ist ja leider nicht alles was gemacht werden muss, man muss ja auch testen ob alle Zeichen im Stream gelesen wurden. Alles in allem eine mögliche Lösung wenn auch nicht die Beste.
Das was du suchst ist boost::lexical_cast. Leider nicht Standard
kann allerdings für so gut wie jeden Compiler von boost.org runtergeladen werden.cout << "Bitte geben Sie ihren Namen ein!"; cin >> name; cout << "Bitte geben Sie ihren Vornamen ein!"; cin >> vorname; cout << "Bitte geben Sie ihr Alter an!"; cin >> alter; cout << "Ihre Eingabe lautet: " << name << ", " << vorname << ", " << alter << "!" << endl; try { int alt,zeit; alt = lexical_cast<int>(alter); zeit = 100 - alt; cout << "Sie brauchen noch " << zeit << " Jahre um 100 Jahre alt zu werden!" << endl; } catch (bad_lexical_cast&) { cout << "Na hat da wer geflunkert?" << endl; }
-
#include <strstream> #include <iostream> using namespace std; stringstream ios; ios.exceptions(stringstream::failbit); // exceptions einschalten, historisch bedingt off. ios << "AA"; int f; try { ios >> f; // wirft std::ios_base::failure!!!!!!!!!!!! } catch(const std::ios_base::failure &ex) { std::cerr << ex.what() << std::endl; }
-
stringstream ios; ios.exceptions(stringstream::failbit); ios << "156AA"; int f; try { ios >> f; // wirft kein std::ios_base::failure } catch(const std::ios_base::failure &ex) { std::cerr << ex.what() << std::endl; }Je nach Ansichtssache ist eine Convertirung von "156AA" zu 156 falsch.
-
Um zu prüfen ob eine Eingabe eine Zahl oder ein Buchstabe ist, reicht doch die Verwendung von
isalphahttp://cppreference.com/stdstring/isalpha.html
mit einer negativabfrage. Oder irre ich mich??
rya.
Scorcher24
-
@Scorcher24: Das läuft für einzelne Zeichen, hat aber nichts damit zu tun, ob eine Zahl ein float/double/sonstwas darstellt.
MfG SideWinder
-
Scorcher24 schrieb:
Um zu prüfen ob eine Eingabe eine Zahl oder ein Buchstabe ist, reicht doch die Verwendung von
isalphahttp://cppreference.com/stdstring/isalpha.html
mit einer negativabfrage. Oder irre ich mich??
Siehe Sides & Bens Einwürfe...
Versuch's so:myStream >> myInt; // if (myStream && myStream.eof()) { // oder: if (!myStream.fail() && myStream.eof()) { // alles ok } else { // Stream war nicht OK, // Stream war leer, // Konvertierung schlug fehl, // String war nicht komplett als int interpretierbar, // ... // throw up!? } // oder ganz einfach #include <boost/lexical_cast.hpp> // ... try { myInt = lexical_cast<int>(myString); } catch (bad_lexical_cast& exc) { // ... }