Frage

Was ist der sicherste und beste Weg, um einen nicht signierten Long von einer Zeichenfolge in C ++ abzurufen?

Ich kenne eine Reihe möglicher Methoden.

Zunächst konvertieren Sie ein signiertes, langes, langes aus Atol.

char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));

Das offensichtliche Problem dabei ist: Was passiert, wenn der in MYSTR gespeicherte Wert größer als ein signierter langer langer Wert ist? Was holt Atol ab?

Die nächste Möglichkeit besteht darin, Strtoul zu verwenden.

char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);

Dies ist jedoch für meine Bedürfnisse etwas über kompliziert. Ich hätte gerne eine einfache Funktion, Zeichenfolge, unsigned Long Base 10 Out. Auch der Fehlerbehebung lässt viel zu wünschen übrig.

Die endgültige Möglichkeit, die ich gefunden habe, besteht darin, SSCANF zu verwenden.

char *myStr; // Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
    //do some error handling
}

Auch hier lässt der Fehler viel zu wünschen übrig und etwas komplizierter, als ich gerne hätte.

Die verbleibende offensichtliche Option besteht darin, meine eigene entweder einen Wrapper um eine der vorherigen Möglichkeiten zu schreiben oder eine Sache, die durch die Saite radelt und jede Ziffer manuell konvertiert, bis sie ULONG_MAX erreicht.

Meine Frage ist, welche anderen Optionen, die mein Google-Fu nicht gefunden hat? Etwas in der C ++ STD -Bibliothek, das eine Zeichenfolge sauber in einen nicht signierten Long konvertiert und Ausnahmen zum Ausfall auslöst?

Ich entschuldige mich, wenn dies ein Betrüger ist, aber ich konnte keine Fragen finden, die genau zu meinem entsprachen.

War es hilfreich?

Lösung

Eine Möglichkeit, es zu tun:

stringstream(str) >> ulongVariable;

Andere Tipps

Sie können Strtoul ohne Problem verwenden. Die Funktion gibt eine unsignierte lange zurück. Wenn die Konvertion nicht durchgeführt werden kann, ist die Funktion return 0. Wenn der korrekte lange Wert außerhalb des Bereichs ist, ist die Funktion return ulong_max und die globale Errno -Variable auf Erange eingestellt.

template <class T>
T strToNum(const std::string &inputString,
           std::ios_base &(*f)(std::ios_base&) = std::dec)
{
    T t;
    std::istringstream stringStream(inputString);

    if ((stringStream >> f >> t).fail())
    {
        throw runtime_error("Invalid conversion");
    }
    return t;
}


// Example usage
unsigned long ulongValue = strToNum<unsigned long>(strValue);
int intValue             = strToNum<int>(strValue);

int intValueFromHex      = strToNum<int>(strHexValue,std::hex);
unsigned long ulOctValue = strToNum<unsigned long>(strOctVal, std::oct);

Wenn Sie die Boost -Bibliotheken (www.boost.org) verwenden können

#include "boost/lexical_cast.hpp"

dann müssen Sie nur noch tun, ist

unsigned long ul = boost::lexical_cast<unsigned long>(str);

Jeffrey Stedfast hat einen schönen Beitrag Über das Schreiben von Int -Parser -Routinen für Mono (in C).
Es generiert Code, der native Typen verwendet (Sie benötigen 32 Bit, um 32 Bit zu analysieren) und Fehlercodes für Überlauf.

Verwenden Sie "Atol" eingebaute STD-Funktion

Zum Beispiel std :: string input = "1024";

std :: atol (input.c_str ());

ATOL erwarten, dass der Parameter vom Typ C -String ist, also macht c_str () das für Sie.

Robuster Weg wird eine statische Funktion schreiben und sie verwenden

bool str2Ulong(const string& str,unsigned long & arValue)
{
   char *tempptr=NULL;
   arValue=strtoul(str,tempptr,10);

   return ! (arValue==0 && tempptr==str.c_str());

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top