2009-09-30 49 views

Respuesta

15

std::strtoul() es la única. Y luego están los viejos como atoi().

+2

atoi no funciona sin firmar, ¿verdad? En Windows CRT, devolverá un error (ERANGE) en caso de desbordamiento. – Cheeso

+0

Cheeso, sí, por lo que puedo decir por la "i", es int ;-) –

11

Boost proporciona lexical_cast.

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

Alternativamente, se puede utilizar un stringstream (que es básicamente lo que hace lexical_cast bajo las sábanas):

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

Y si quiere una interpretación no decimal, vea también: http://stackoverflow.com/questions/1070497/c-convert- Hex-string-to-signed-integer – Martin

+0

¿Soy la única persona a la que le encanta la inserción de secuencias, pero detesta la extracción de secuencias? Yo usaría funciones (como este impulso, aunque para ser honesto, probablemente todavía usaría atoi sin pensar) todo el tiempo. – Steve314

+0

Sí, la extracción de flujo es bastante fea, especialmente porque no puede inicializar constantes con ella. También es bastante más potente, ya que puedes usar manipuladores para cambiar tu base, etc. – Martin

-3

¿Qué tal int atoi (const char * str)?

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

Esta no es una buena sugerencia. Específicamente, solicitó "unsigned int" y menciona cosas como "_ultoa". El póster sabe acerca de atoi(), atol(), etc. Todas estas funciones están firmadas y reconocen el símbolo -, pueden manejar el desbordamiento, etc. La respuesta correcta es usar funciones como strtoul. – Armentage

1

sscanf va a hacer lo que quiere.

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

Odiaba a la familia scanf incluso en C. Nunca hizo lo que yo quería que hiciera, y la mayoría de las veces causaba un error. Está bien si sabe que la cadena coincide con sus requisitos, si ya la ha revisado o la ha extraído con otro código, pero en ese caso, ¿por qué no simplemente usa atoi o lo que sea? Cualquiera que use una función scanf-family - bueno, hay algunos crímenes donde ningún castigo puede ser demasiado severo ;-) – Steve314

+0

Eso debería ser "Cualquier persona que use una función scanf-family en C++ - ..." – Steve314

0

Funciona si vas a través de _atoi64

largo sin signo l = _atoi64 (str);