Wie bekommt man ein unsigned long aus einem string?
Was ist der sicherste und beste Weg, um ein unsigned long aus einem string in C++?
Ich kenne eine Reihe von möglichen Methoden.
Ersten konvertieren eine signierte long genommen von atol.
char *myStr; //Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
Das offensichtliche problem mit diesem ist, was passiert, wenn der gespeicherte Wert in myStr größer ist als signed long enthalten? Was bedeutet das atol abrufen?
Die nächste Möglichkeit ist die Verwendung von strtoul.
char *myStr; //Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
Allerdings ist dies ein wenig kompliziert für meine Bedürfnisse. Ich möchte eine einfache Funktion, string, unsigned long zur Basis 10. Auch der Fehler-handling lässt sehr zu wünschen übrig.
Die Letzte Möglichkeit, die ich gefunden habe, ist die Verwendung von sscanf.
char *myStr; //Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
//do some error handling
}
Wieder, Fehler-Handhabung lässt viel zu wünschen übrig, und ein wenig komplizierter, als ich möchte.
Den übrigen offensichtliche option ist das schreiben meiner eigenen entweder ein wrapper um eine der vorherigen Möglichkeiten oder irgendeine Sache, die Zyklen, die durch den string und manuell konvertiert jede Ziffer, bis es erreicht ULONG_MAX.
Meine Frage ist, was sind die anderen Optionen, dass mein google-fu versagt hat, zu finden? Jedes Ding, das in die C++ - std-Bibliothek, die werden sauber konvertiert einen string in einen unsigned long und Ausnahmen werfen Versagen?
Ich entschuldige mich, wenn dies ist ein dupe, aber ich konnte nicht finden, Fragen, die genau meinen.
atol
: "Wenn der richtige Wert ist außerhalb des Bereichs der darstellbaren Werte, LONG_MAX oder LONG_MIN zurückgegeben." cplusplus.com/reference/clibrary/cstdlib/atolPaar Fragen bin ich mir nicht sicher, ob Sie Duplikate sind jedoch: (1) stackoverflow.com/questions/1243428/... (2) stackoverflow.com/questions/1435253/...
Ich verstehe nicht, was haben Sie gegen strtoul. Es ist die perfekte Funktion für diese. Geben Sie eine 0 für die Basis-und es wird konvertieren von zahlen mit beliebiger Basis-Präfix-strings Ihre C-Bibliothek versteht, wie "0x".
InformationsquelleAutor Daniel Bingham | 2009-09-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Weg, es zu tun:
Das ist eigentlich nicht notwendig, da
std::string
hat einen impliziten Konstruktor, der ein C-Stil-string als parameter. Diesem Konstruktor können Sie einfach zu schreibenstringstream("whatever")
.smack selbst natürlich. Auch so, es ist das Ergebnis der Instanziierung zwei Klassen - und Speicher-management innewohnt, dass - um zu tun, was eine einfache Funktion mit einem einzelnen internen loop sollte in der Lage sein zu erreichen. Ich wünschte, es gäbe so etwas wie, gebaut in der standard-Bibliothek.
Gute C++ - Compiler sind aggressiv-Optimierer. Immer im Hinterkopf behalten. Ich sage nicht, es ist die Schnellste Möglichkeit, aber es sollte halbwegs schnell.
denke nicht an die Leistung aus, bis Sie zu haben. Sind Sie sicher, dass dieser code muss extrem schnell sein? Sind Sie sicher, dass diese Lösung ist nicht extrem schnell?
InformationsquelleAutor Mehrdad Afshari
Können Sie strtoul mit kein problem. Die Funktion gibt einen unsigned long. Wenn die Konvertierung nicht durchgeführt werden kann, wird die Funktion 0 zurückgeben. Wenn die richtigen long-Wert ist außerhalb des Bereichs der Funktion return ULONG_MAX und die Globale variable errno gesetzt, um ERANGE.
Ausnahme Stil Fehlerbehandlung, aber kein overhead durch Klassen? Klingt ein bisschen paradox, imo 🙂
Gut, die Funktionen tun können, Ausnahme Stil Fehlerbehandlung. Ich will nur nicht zu instanziieren zwei Klassen brauche ich nicht jedes mal wenn ich Sie konvertieren möchten lange. Es scheint sehr verschwenderisch!
Für Unicode verwenden wcstoul(string, NULL, 0)
InformationsquelleAutor Patrice Bernassola
InformationsquelleAutor RC.
Wenn Sie können, verwenden Sie die boost-Bibliotheken (www.boost.org) Blick auf die conversion-Bibliothek - es ist ein header enthalten nur
dann alles, was Sie tun müssen, ist
InformationsquelleAutor
Jeffrey Stedfast hat einen schönen post über das schreiben int parser-Routinen, die Sie für Mono (C).
Es generiert code, der verwendet, verwendet native Typen (Sie benötigen 32-bit zu analysieren, 32 bit) und error-codes für den überlauf.
InformationsquelleAutor Shay Erlichmen
Verwenden "atol" in-built-std Funktion
Zum Beispiel std::string input = "1024";
std::atol(input.c_str());
Atol erwartet parameter vom Typ c-string, also c_str() macht es das für Sie.
InformationsquelleAutor PURVESH PATEL
Robuste Art und Weise werden
schreiben Sie eine statische Funktion, und verwenden Sie es
InformationsquelleAutor Satbir