2011-01-18 20 views
5

tengo un std :: string: 01001, quiero obtener cada número:parte std :: string en número entero

std::string foo = "01001"; 
for (int i=0; i < foo.size(); ++i) 
{ 
    int res = atoi(foo[i]); // fail 
    int res = atoi(&foo[i]); // ok, but res = 0 in any case 
} 

cómo hacerlo?

Respuesta

9

Esta es la manera más fácil que veo:

std::string foo = "01001"; 
for (int i=0; i < foo.size(); ++i) 
{ 
    int res = foo[i] - '0'; 
} 
3

Cada dígito se puede obtener mediante el simple uso de la sustracción:

int res = foo[i] - '0'; 

atoi toma una cadena terminada en cero, no un carácter individual. El enfoque de resta funciona porque se garantiza que los diez dígitos decimales serán consecutivos en el conjunto de caracteres (obviamente, si hay una posibilidad de que tengas caracteres que no sean de dígitos en la cadena, querrás hacer un manejo de errores adecuado).

+0

¿Cómo funciona esto? – Ockonal

6

Si conoces a todos los caracteres de foo está dígitos, puede utilizar (int) (foo[i] - '0') lo que le resta el valor ASCII de '0' del carácter. Esto funciona para todos los dígitos porque sus valores ascii son consecutivos.

Su primer intento falla porque foo[i] es un solo char, mientras que atoi() toma una cstring. Su segundo intento falla porque &foo[i] es una referencia a ese personaje.

+1

C y C++ requieren que los valores utilizados para representar los dígitos decimales sean consecutivos; no es estrictamente dependiente del juego de caracteres. –

0

Una forma sencilla, muy cerca de lo que tienes, sería insertar el carbón en una cadena predefinida, tales como:

std::string foo = "01001"; 
char str[] = {" "}; 
for (int i=0; i < foo.size(); ++i) 
{ 
    str[0] = foo[i]; 
    int res = atoi(str); 
}