Parsen?
-
Manni25 schrieb:
...
Wie funktioniert das in c++?Danke.
Im "von C geerbten Subteil" von C++, zu dem atoi() gehört, hast du "Pech gehabt" - die sagen einfach "undefined Behavior".
Deshalb bliebe dir nicht viel anderes übrig, als vorher per "isdigit()" jedes einzelne Zeichen abzuprüfen........ und weil das nicht schön, ist, hat man bei C++ die stringstreams erfunden.

Wie das geht, steht im o.g. Thread beschrieben ... und anschließend kannst du den Streamstatus direkt abfragen:... if(!Str) throw meine_Exception("Die Konvertierung hat nicht geklappt"); ...(geht auch direkt beim Aufruf des operator>>())
Gruß,
Simon2.
-
Optional kannst du dir von den Stringstreams auch eine Exception werfen lassen, falls dir das lieber ist.
-
Simon2 schrieb:
"undefined Behavior".
Ist das so?
Im Falle eines (int) Overflows ist das _Ergebnis_ undefiniert. Bei unpassender Eingabe ("rrr") ist das Ergebnis aber 0.The return value is 0 (for atoi and _atoi64), 0L (for atol), or 0.0 (for atof) if the input cannot be converted to a value of that type.
-
Simon2 schrieb:
Im "von C geerbten Subteil" von C++, zu dem atoi() gehört, hast du "Pech gehabt" - die sagen einfach "undefined Behavior".
Deshalb bliebe dir nicht viel anderes übrig, als vorher per "isdigit()" jedes einzelne Zeichen abzuprüfen.....Tja aber nur, wenn man den "von C geerbten Subteil" nur oberflächlich und dessen schon seit C89 für diese Fälle bereitstehenden Funktionen wie strtol inkl. Fehler/Überlaufhandling nicht kennt.
-
Vicious Falcon schrieb:
Simon2 schrieb:
"undefined Behavior".
Ist das so?
Im Falle eines (int) Overflows ist das _Ergebnis_ undefiniert. Bei unpassender Eingabe ("rrr") ist das Ergebnis aber 0....Hatte vorhin kurz im C99 nachgeschaut (OK - nicht im C++98 und auch nicht ewig rumgesucht) und den Passus so verstanden.
Wutz schrieb:
...Tja aber nur, wenn man den "von C geerbten Subteil" nur oberflächlich und dessen schon seit C89 für diese Fälle bereitstehenden Funktionen wie strtol inkl. Fehler/Überlaufhandling nicht kennt.
Ok - habe ich ungeschickt ausgedrückt. Mir ist schon klar, dass man auch in C sicher und sauber Text in Zahlen parsen kann (mache ich auch ständig) - nur eben mit atoi() ein wenig umständlich.
Auch bin ich mir nicht sicher, dass er den Unterschied zwischen "von C geerbtem C++" und "exklusivem C++" kennt - da hielt ich eine Hinweis darauf für angebracht.Gegenfrage: Wenn der Kollege
- von Java kommt,
- im C++-Forum nachfragt,
- den FAQ-Artikel in den Fingern und
- mit der Anwendung atoi() und anscheinend
- dem Lesen deren Spezifikation dem Probleme hat,
... ist dann der Rat zu stringstreams wirklich so verwerflich?
Gruß,
Simon2.
-
.. ist dann der Rat zu stringstreams wirklich so verwerflich?
Jedenfalls wurde er gleich verworfen.
-
... ist dann der Rat zu stringstreams wirklich so verwerflich?
Es ist der einzig richtige Rat.
-
boost::lexical_cast
wirft eine bad_cast Exception, falls was schief lief.
-
Java ähnlicher ist Qt, da wäre das ganze ein
int a = QString("123").toInt();was mir persönlich lieber ist als die stringstream Variante (für die ich unter MFC auch einen toInt(str) wrapper geschrieben hatte)
-
Panke schrieb:
.. ist dann der Rat zu stringstreams wirklich so verwerflich?
Jedenfalls wurde er gleich verworfen.
Vermutlich weil er spontan eine Funktion sucht (deren Konzept er schon kennt) als ein neues Konzept.
Kann ich verstehen, sollte aber trotzdem nicht seine Strategie bleiben....Gruß,
Simon2.