C ++ 11 hat einige neue Funktionen zur Konvertierung von Zeichenfolgen hinzugefügt:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Es umfasst stoi (string to int), stol (string to long), stoll (string to long long), stoul (string to unsigned long), stoull (string to unsigned long long). Bemerkenswert in seiner Abwesenheit ist eine stou-Funktion (Zeichenfolge zu vorzeichenlos). Gibt es einen Grund, warum es nicht benötigt wird, aber alle anderen?
Verwandte: Keine "sto {short, unsigned short}" -Funktionen in C ++ 11?
unsigned long
gerechtes Nein istunsigned int
.unsigned long
es 64 Bit undunsigned int
32. Es handelt sich um verschiedene Typen, von denen nicht angenommen werden kann, dass sie identisch sind.stou
" Frage, sondern eine Frage, die nach einem möglicherweise eindeutigen Grund für diese offensichtliche Inkonsistenz fragt. Wenn Sie wissen, dass es keinen solchen Grund gibt, posten Sie ihn als Antwort.Antworten:
Die beste Antwort wäre, dass die C-Bibliothek kein entsprechendes "
strtou
" hat und die C ++ 11-Zeichenfolgenfunktionen nur dünn verschleierte Wrapper um die C-Bibliotheksfunktionen sind: Diestd::sto*
Funktionen spiegelnstrto*
sich und diestd::to_string
Funktionen werden verwendetsprintf
.Edit: Wie KennyTM weist darauf hin, beide
stoi
undstol
Verwendungstrtol
als die zugrunde liegenden Umwandlungsfunktion, aber es ist immer noch mysteriös , warum während es existiert ,stoul
dass Anwendungenstrtoul
, gibt es keine entsprechendstou
.quelle
boost::lexical_cast<>()
scheint eine eher C ++ - Methode zu sein.sto*
, C ++ 11 21.5 / 1: Effekte: Die ersten beiden Funktionen rufen strtol (str.c_str (), ptr, base) und die letzten drei Funktionen strtoul (str.c_str (), ptr, base auf ), strtoll (str.c_str (), ptr, base) bzw. strtoull (str.c_str (), ptr, base).std::sto*
dass er als Wrapper für die C-Bibliotheksfunktionen implementiert werden muss, und Ein gültiges Programm kann nicht sagen, dass sie nicht heimlich anders implementiert sind. Die Implementierung ist gültig.Ich habe keine Ahnung, warum es
stoi
existiert, aber nichtstou
, aber der einzige Unterschied zwischenstoul
und einer Hypothesestou
wäre eine Überprüfung, ob das Ergebnis im Bereich vonunsigned
:(Ebenso
stoi
ist es ähnlichstol
, nur mit einer anderen Bereichsprüfung; aber da es bereits existiert, müssen Sie sich keine Gedanken darüber machen, wie es genau implementiert werden soll.)quelle
stoi
undstol
, oderstol
undstoll
ist auch nur eine Bereichsprüfung.stoi
undstol
ja. Aberstol
undstoll
unterscheiden sich nicht nur in Bereichsprüfung, sie verschiedene Bibliotheksfunktionen aufrufen.Wenn Sie Masken verwenden, um dies mit der erwarteten Wertgröße in den in der Maske ausgedrückten Bits zu tun, funktioniert dies für 64-Bit-Longs gegenüber 32-Bit-Ints, aber auch für 32-Bit-Longs gegenüber 32-Bit-Ints.
Bei 64-Bit-Longs wird ~ 0xffffffffl zu 0xffffffff00000000 und prüft somit, ob eines der oberen 32 Bits gesetzt ist. Bei 32-Bit-Longs wird ~ 0xffffffffl zu 0x00000000 und die Maskenprüfung ist immer Null.
quelle