Parameter einer Konsoleanwendung umwandeln
-
hallo forum,
wie bekomme ich den inhalt des parameters argv[] in einen integer gewandelt ?
der parameter soll als Zahl mit einem Wertebereich von 1 bis 999 gegeben werden.//Programm Zahl.cpp : Aufruf "zahl 999"
int main(int argc, char * argv[]) { //parameter argv[1] entgegen nehmen und verarbeiten cout << "ein parameter" << endl; cout << argv[1] << endl; //zum Integer wandeln int z= ??? return 0; }
-
Mit
strtol
und dessen Varianten.
-
strtol nutze ich auch gern, weil es vielseitig ist. Aber man sollte immer berücksichtigen: Der Performanceknaller ist es nicht. Würde ich 100 Mio Strings in Zahlen umwandeln wollen, wäre strtol nicht meine erste Wahl.
-
...es ist aber doch auch eher unwahrscheinlich, dass du 100 Mio Strings hast. Viel wahrscheinlicher hast du bei so einer Datenmenge dann doch einen Stream oder irgendeinen anderen Puffer, in welchem die umzuwandelnden Rohdaten liegen.
Edit: oder wolltest du auf
std::from_chars
hinaus? Oder den Talk von Alexandrescu, wo er seine Ideen für schnellere "string"<->int Konvertierung erklärt (gibts irgendwo auf youtube)?
-
@wob sagte in Parameter einer Konsoleanwendung umwandeln:
...es ist aber doch auch eher unwahrscheinlich, dass du 100 Mio Strings hast. Viel wahrscheinlicher hast du bei so einer Datenmenge dann doch einen Stream oder irgendeinen anderen Puffer, in welchem die umzuwandelnden Rohdaten liegen.
Edit: oder wolltest du auf
std::from_chars
hinaus? Oder den Talk von Alexandrescu, wo er seine Ideen für schnellere "string"<->int Konvertierung erklärt (gibts irgendwo auf youtube)?Im Börsenumfeld sind soviele Zahlen nicht unwahrscheinlich. Aber du hast natürlich recht, dass die im Allgemeinen nicht als Klartext abgelegt werden sondern etwas "praktikabler".
Und wenn du dich mit stream auf stringstreams bezieht, kann ich dir sagen, dass das mit Abstand die langsamste Variante ist, Text in Zahlen umzuwandeln.
-
@It0101 sagte in Parameter einer Konsoleanwendung umwandeln:
strtol nutze ich auch gern, weil es vielseitig ist. Aber man sollte immer berücksichtigen: Der Performanceknaller ist es nicht. Würde ich 100 Mio Strings in Zahlen umwandeln wollen, wäre strtol nicht meine erste Wahl.
Nanu, was würdest du sonst nehmen? Etwas handgeschriebenes ohne die Option auf Nicht-Dezimalformate und ohne Trimming? Das sind doch bloß zwei bis drei Verzweigungen pro Zahl, die man damit sparen könnte, auf kosten von eventuellen anderen Tricks, auf die man als Einzelkämpfer nicht kommt. Jedenfalls ist
strtol
die schnellste mir bekannte Standardfunktion (außer vlt. das noch recht neue from_chars) und um Größenordnungen besser als der klassische Umweg über Stringstreams.Wobei der Stream aber auch gut sein kann, wenn die Daten sowieso schon als Stream vorliegen, sofern man sie dann direkt liest, und nicht (wie es oft gemacht wird) den Stream erst noch in Unterstrings zerlegt. Aber der Fall liegt hier nicht vor, da man ja ein klassisches char-Array hat.
-
@SeppJ sagte in Parameter einer Konsoleanwendung umwandeln:
@It0101 sagte in Parameter einer Konsoleanwendung umwandeln:
strtol nutze ich auch gern, weil es vielseitig ist. Aber man sollte immer berücksichtigen: Der Performanceknaller ist es nicht. Würde ich 100 Mio Strings in Zahlen umwandeln wollen, wäre strtol nicht meine erste Wahl.
Nanu, was würdest du sonst nehmen?
atol Wenn die Performanceunterschiede so krass sind und ich keine besonderen Ansprüche habe, nehm ich das ganz gerne mal. Zumindest wenn in dem Anwendungsfall Performance ein Thema ist. Was ja längst nicht immer der Fall ist.
-
@It0101 sagte in Parameter einer Konsoleanwendung umwandeln:
atol Wenn die Performanceunterschiede so krass sind und ich keine besonderen Ansprüche habe, nehm ich das ganz gerne mal. Zumindest wenn in dem Anwendungsfall Performance ein Thema ist. Was ja längst nicht immer der Fall ist.
Igitt!
Hast du Zahlen zum Performanceunterschied? Auch wenn du Fehlerbehandlung (die bei atol sehr umständlich ist) mit einschließt, die man bei Nutzereingaben immer machen sollte? (Theoretisch muss man bei atol ja vorher sogar die Länge prüfen, da eine zu lange Zahl nicht nur ein Fehlerfall ist, sondern sogar richtig undefiniertes Verhalten)
-
@SeppJ Ich hab vor ein paar Jahren mal was gebastelt was richtig grosse Testfiles mit haufenweise Integers, Strings etc. schreiben und einlesen sollte. Das Ergebnis war dass ich mir alles bis auf die floating-point Sachen selbst geschrieben habe. Und die floating-point Sachen auch nur deswegen nicht, weil der Anteil an floating-point Einträgen in den Files für die das Ding gedacht war minimal war.
Eine potentiell grosse Bremse bei
strtol
ist dass es ja nach locale zusätzliche Zeichen bzw. Zahlenformate unterstützen kann. Ich weiss nicht ob das irgendwo wirklich implementiert ist, aber jeder Zugriff auf die locale bremst schonmal. Selbst wenn dabei rauskommt dass es eh nix zusätzlich zu beachten gibt weil "C" locale.Wie
from_chars
im Vergleich zu (gutem, schnellem, auf das nötige reduzierten) selbst geschriebenem Code abschneidet weiss ich nicht. Ich würde erwarten nicht so schlecht, da es die locale ignoriert und zumindest die MSVC Implementierung inline ist.
-
@SeppJ sagte in Parameter einer Konsoleanwendung umwandeln:
Nanu, was würdest du sonst nehmen?
Achtung, nicht ganz ernst gemeint: boost::qi::spirit.
Immerhin wird hier behauptet sie hätten die schnellsten numerischen Parser. Etwas älterer Stand.Aber man kann es auch übertreiben...
-
@5cript sagte in Parameter einer Konsoleanwendung umwandeln:
Achtung, nicht ganz ernst gemeint: boost::qi::spirit.
Ein noch größeres Kaliber hattest Du nicht gefunden?
Die Laufzeit des Compilers war zumindest früher mit Spirit unterirdisch.
-
@john-0 sagte in Parameter einer Konsoleanwendung umwandeln:
@5cript sagte in Parameter einer Konsoleanwendung umwandeln:
Achtung, nicht ganz ernst gemeint: boost::qi::spirit.
Ein noch größeres Kaliber hattest Du nicht gefunden?
Deswegen mein fetter remark
-
@5cript sagte in Parameter einer Konsoleanwendung umwandeln:
@john-0 sagte in Parameter einer Konsoleanwendung umwandeln:
@5cript sagte in Parameter einer Konsoleanwendung umwandeln:
Achtung, nicht ganz ernst gemeint: boost::qi::spirit.
Ein noch größeres Kaliber hattest Du nicht gefunden?
Deswegen mein fetter remark
Du reinigst deine Dachrinne schon gelegentlich mit einem Eisenbahngeschütz oder?
-
@It0101 sagte in Parameter einer Konsoleanwendung umwandeln:
@5cript sagte in Parameter einer Konsoleanwendung umwandeln:
@john-0 sagte in Parameter einer Konsoleanwendung umwandeln:
@5cript sagte in Parameter einer Konsoleanwendung umwandeln:
Achtung, nicht ganz ernst gemeint: boost::qi::spirit.
Ein noch größeres Kaliber hattest Du nicht gefunden?
Deswegen mein fetter remark
Du reinigst deine Dachrinne schon gelegentlich mit einem Eisenbahngeschütz oder?
Aber es ist nicht irgendein Eisenbahngeschütz, sondern das schnellste Eisenbahngeschütz. Das ist schon was.
Das schreit eigentlich nach einem großen Performancevergleichstest aller erwähnten Methoden. Insbesondere aller Ideen zur Optimierung des selbstgeschriebenen Parsers.
-
@SeppJ sagte in Parameter einer Konsoleanwendung umwandeln:
Aber es ist nicht irgendein Eisenbahngeschütz, sondern das schnellste Eisenbahngeschütz. Das ist schon was.
Eisenbahnrailgun
-
@hustbaer
Ich nehm dafür einen Baseball und beschleunige diesen auf 90% Lichtgeschwindigkeit. Macht ordentlich sauber.XKCD: What would happen if you tried to hit a baseball pitched at 90% the speed of light?