strtoint programming plus long convertir atod c++ string int strtol

c++ - programming - Conceptos básicos de strtol?



strtoint c++ (4)

Estoy realmente confundido. Me falta algo bastante simple, pero nada de lo que estoy leyendo sobre strtol () tiene sentido. ¿Puede alguien deletrearlo de una manera muy básica, así como dar un ejemplo de cómo podría funcionar algo como lo siguiente?

string input = getUserInput; int numberinput = strtol(input,?,?);


Cita de la referencia de C ++ :

long int strtol ( const char * str, char ** endptr, int base );

Convertir cadena a entero largo

Analiza la cadena C interpretando su contenido como un número integral de la base especificada, que se devuelve como un valor int largo. Si endptr no es un puntero nulo, la función también establece el valor de endptr para apuntar al primer carácter después del número.

Intente algo como

long l = strtol(pointerToStartOfString, NULL, 0)


El primer argumento es la cadena. Tiene que pasarse como una cadena C, por lo que si tiene una std::string use .c_str() .

El segundo argumento es opcional y especifica un char * para almacenar un puntero al carácter después del final del número. Esto es útil al convertir una cadena que contiene varios enteros, pero si no lo necesita, simplemente establezca este argumento en NULL.

El tercer argumento es el radix (base) para convertir. strtol puede hacer cualquier cosa, desde binario (base 2) hasta base 36. Si desea que strtol elija la base automáticamente en base al prefijo, pase 0.

Entonces, el uso más simple sería

long l = strtol(input.c_str(), NULL, 0);

Si sabe que obtiene números decimales:

long l = strtol(input.c_str(), NULL, 10);

strtol devuelve 0 si no hay caracteres convertibles al comienzo de la cadena. Si desea verificar si strtol tuvo éxito, use el argumento del medio:

const char *s = input.c_str(); char *t; long l = strtol(s, &t, 10); if(s == t) { /* strtol failed */ }

Si usa C ++ 11, use stol lugar:

long l = stol(input);

Alternativamente, puedes usar un stringstream , que tiene la ventaja de poder leer muchos elementos con facilidad como cin :

stringstream ss(input); long l; ss >> l;


Siempre uso simplemente strol(str,0,0) - devuelve un valor largo. 0 para radix (último parámetro) significa autodetectarlo desde la cadena de entrada, por lo que tanto 0x10 como hexadecimal y 10 como decimal podrían usarse en la cadena de entrada.


Supongamos que te dan una cadena char const * str . Ahora conviértalo así:

#include <cstdlib> #include <cerrno> char * e; errno = 0; long n = std::strtol(str, &e, 0);

El último argumento 0 determina la base numérica que desea aplicar; 0 significa "autodetectar". Otros valores razonables son 8 , 10 o 16 .

A continuación, debe inspeccionar el puntero final e . Esto apunta al personaje después de la entrada consumida. Por lo tanto, si se consumió toda la entrada, apunta al terminador nulo.

if (*e != ''/0'') { /* error, die */ }

También es posible permitir el consumo de entrada parcial con e , pero ese es el tipo de cosas que comprenderá cuando realmente lo necesite.

Por último, debe verificar si hay errores, que básicamente pueden ser errores de desbordamiento si la entrada no cabe en el tipo de destino:

if (errno != 0) { /* error, die */ }

En C ++, podría ser preferible usar std::stol , aunque en este caso no puede elegir la base numérica:

#include <string> try { long n = std::stol(str); } catch (std::invalid_argument const & e) { /* error */ } catch (std::out_of_range const & e) { /* error */ }