2008-10-14 15 views
45

Possible Duplicate:
How to parse a string to an int in C++?¿Cómo se convierte una cadena de C++ a un int?

¿Cómo convertir una cadena de C++ a un int?

Supongamos que espera que la cadena tenga números reales ("1", "345", "38944", por ejemplo).

Además, supongamos que no tiene impulso, y realmente quiere hacerlo de la manera C++, no la forma C antigua.

+13

¿Qué tal algunos de los ejemplos de los siguientes: http://www.codeproject.com/KB/recipes/Tokenizer.aspx Son muy eficientes y algo elegantes. –

Respuesta

33

Utilice las transmisiones en C++.

std::string  plop("123"); 
std::stringstream str(plop); 
int x; 

str >> x; 

/* Lets not forget to error checking */ 
if (!str) 
{ 
    // The conversion failed. 
    // Need to do something here. 
    // Maybe throw an exception 
} 

PS. Este principio básico es cómo funciona la biblioteca de impulso lexical_cast<>.

Mi método favorito es el impulso lexical_cast<>

#include <boost/lexical_cast.hpp> 

int x = boost::lexical_cast<int>("123"); 

Proporciona un método para convertir entre una cadena y formatos de número y de regreso. Debajo utiliza una secuencia de cadenas para que todo lo que se pueda agrupar en una secuencia y luego desasignar de una secuencia (Eche un vistazo a los operadores >> y < <).

+0

¿no debería ser "if (! X) ..."? – Svante

+4

No. Si el operador de flujo falla al extraer un número de str, establece el bit incorrecto. Al usar esto en un contexto booleano (como el anterior) se probará para ver si la transmisión es correcta devolviendo un objeto que se puede convertir a bool. Si probé 'x', fallaría si el valor puesto en 'x' fuera 0. Si la transmisión no pudo extraer nada, el valor de 'x' no está definido. –

+1

Establece el bit _fallo_, no el _barrito_. ¡operador! es un sinónimo de fail(). – scai

0

Uso atoi

+0

No particularmente C++ ¿verdad? Incluso std :: atoi no es realmente C++ ... –

+2

atoi() tiene otra magia ... como ignorar los espacios en blanco iniciales, ignorar los espacios no blancos finales, y asumir "0" también es una condición de error válida. Utilice atoi() cuando realmente no le importe la validez. De lo contrario, strtod() en C y std :: istringstream en C++. –

72
#include <sstream> 

// st is input string 
int result; 
stringstream(st) >> result; 
+3

¿Qué pasa si hay un error? Supongamos que la cadena no tiene un número ("¡Hola!" En lugar de "5"). – krupan

+20

Luego comprueba el error: (stringstream (st) >> result)? cout << resultado: cerr << "Pierdes"; –

-6

en "stdapi.h"

StrToInt 

Esta función le indica el resultado, y cuántos personajes participaron en la conversión.

+2

¿Eh? Google para este "stdapi.h" no aparece nada. ¿Se refiere a "shlwapi.h" (que es específico de Windows, parte de la DLL de shell y equivalente a las antiguas formas de C)? – bk1e

4

he usado algo así como el siguiente código en C++ antes:

#include <sstream> 
int main() 
{ 
    char* str = "1234"; 
    std::stringstream s_str(str); 
    int i; 
    s_str >> i; 
} 
+1

OK. Alguien ya sugirió esto, así que subí el suyo. – ayaz

0

Tal vez estoy no entender la pregunta, por qué exactamente le no querer usar atoi? No veo el punto de reinventar la rueda.

¿Me estoy perdiendo el punto aquí?

+0

La página de manual para atoi() dice: "La función atoi() está subsumida por strtol() pero se conserva porque se usa extensivamente en el código existente. Si se sabe que el número no está dentro del rango, strtol() debería estar utilizado porque atoi() no es necesario para realizar ninguna comprobación de errores ". – krupan

+0

Pensé que atoi() no era estándar, por lo que no estaba disponible en todas partes. Sin embargo, podría estar equivocado. –

+0

Ese es un punto excelente, Krupan. Admito que no había pensado en eso. – user12576

2

Permítanme añadir mi voto para el impulso :: lexical_cast

#include <boost/lexical_cast.hpp> 

int val = boost::lexical_cast<int>(strval) ; 

Se lanza bad_lexical_cast en caso de error.

Cuestiones relacionadas