2009-09-30 17 views

Antwort

15

std::strtoul() ist die eine. Und dann wieder die alten wie atoi().

+2

Atoi nicht tun, obwohl nicht signiert, richtig? Im Windows-CRT wird bei einem Überlauf ein Fehler (ERANGE) zurückgegeben. – Cheeso

+0

Cheeso, ja, für das, was ich mit dem "i" sagen kann, es ist int ;-) –

11

Boost bietet lexical_cast.

#include <boost/lexical_cast.hpp> 
[...] 
unsigned int x = boost::lexical_cast<unsigned int>(strVal); 

Alternativ können Sie auch eine string verwenden (was im Grunde ist das, was lexical_cast unter den Abdeckungen der Fall ist):

#include <sstream> 
[...] 
std::stringstream s(strVal); 
unsigned int x; 
s >> x; 
+1

Und wenn Sie nichtdezimale Interpretation wollen, siehe auch: http://stackoverflow.com/questions/1070497/c-convert- hex-string-to-signed-integer – Martin

+0

Bin ich die einzige Person, die Stream-Insertion liebt, aber Stream-Extraktion hasst? Ich würde Funktionen (wie diese boost one, obwohl um ehrlich zu sein würde ich wahrscheinlich immer noch atoi ohne zu denken) jedes Mal verwenden. – Steve314

+0

Ja, die Stream-Extraktion ist ziemlich hässlich, vor allem, weil man damit keine Konstanten initialisieren kann. Es ist aber auch ein bisschen leistungsfähiger, da Sie Manipulatoren verwenden können, um Ihre Basis usw. zu ändern. – Martin

-3

Wie wäre es int atoi (const char * str)?

string s("123"); 
unsigned u = (unsigned)atoi(s.c_str()); 
+5

Dies ist überhaupt kein guter Vorschlag. Er wird speziell nach "unsigned int" gefragt und erwähnt Dinge wie "_ultoa". Das Poster kennt atoi(), atol() usw. Diese Funktionen sind alle signiert und erkennen das - Symbol, können mit Überlauf umgehen, etc. Die richtige Antwort ist die Verwendung von Funktionen wie strtoul. – Armentage

1

sscanf wird tun, was Sie wollen.

char* myString = "123"; // Declare a string (c-style) 
unsigned int myNumber; // a number, where the answer will go. 

sscanf(myString, "%u", &myNumber); // Parse the String into the Number 

printf("The number I got was %u\n", myNumber); // Show the number, hopefully 123 
+0

Ich hasste die Scanf-Familie sogar in C. Es hat nie getan, was ich wollte, und meistens verursachte es einen Bug. Es ist in Ordnung, wenn Sie wissen, dass die Zeichenfolge Ihren Anforderungen entspricht - wenn Sie sie bereits überprüft oder mit anderem Code extrahiert haben - aber in diesem Fall, warum nicht einfach atoi oder was auch immer verwenden? Wer eine scanf-family-Funktion nutzt - nun, es gibt einige Verbrechen, bei denen keine Strafe jemals zu hart sein kann ;-) – Steve314

+0

Das sollte sein "Jeder, der eine scanf-family-Funktion in C++ benutzt - ..." – Steve314

0

Es funktioniert, wenn Sie über _atoi64

unsigned long l = _atoi64 (str) gehen;