c unix int64

¿Cómo convertir cadena a int64_t?



unix (6)

¿Cómo convertir el parámetro del programa de argv a int64_t ? atoi() es adecuado solo para enteros de 32 bits.


Esto me funcionó con un tipo diferente de int64, y me gusta el estilo limpio de C ++:

std::istringstream iss(argv[i]); int64_t i64; iss >> i64;

Puede obtener un error de compilación: operartor << ... no está definido.

Y no sé qué sucede, si argv [i] contiene "HALLO".


Hacer esto de manera portátil es un poco complicado. se requiere long long para que sea al menos de 64 bits, pero no necesariamente tiene que ser dos complementos, por lo que podría no ser capaz de representar -0x7fffffffffffffff-1 , y por lo tanto, usar strtoll podría tener una caja de esquina rota. El mismo problema se aplica a strtoimax . Lo que podría hacer en cambio es consumir el espacio strtoull (si desea permitir el espacio strtoull ) y verificar primero el signo, luego use strtoull o strtoumax , cualquiera de los cuales es necesario para admitir valores hasta el rango positivo completo de int64_t . A continuación, puede aplicar el signo:

unsigned long long x = strtoull(s, 0, 0); if (x > INT64_MAX || ...) goto error; int64_t y = negative ? -(x-1)-1 : x;

Esta lógica está escrita para evitar todos los casos de desbordamiento.


Hay algunas maneras de hacerlo:

strtoll(str, NULL, 10);

Esto es compatible con POSIX C99.

También puedes usar strtoimax; el cual tiene el siguiente prototipo:

strtoimax(const char *str, char **endptr, int base);

Esto es bueno porque siempre funcionará con el intmax_t local ... Esto es C99 y debe incluir <inttypes.h>


Los usuarios procedentes de una búsqueda en la web también deben considerar std::stoll .

No responde estrictamente a esta pregunta original de manera eficiente para un const char* pero muchos usuarios tendrán una std::string todos modos. Si no te importa la eficiencia, deberías obtener una conversión implícita (basada en la conversión definida por el usuario usando el constructor de std::string single-argument) a std::string incluso si tienes un const char* .

Es más simple que std::strtoll que siempre requerirá 3 argumentos.

Se debe lanzar si la entrada no es un número, pero vea estos comentarios .


Un intento de conformación C99.

[editar] empleado @R. corrección

// Note: Typical values of SCNd64 include "lld" and "ld". #include <inttypes.h> #include <stdio.h> int64_t S64(const char *s) { int64_t i; char c ; int scanned = sscanf(s, "%" SCNd64 "%c", &i, &c); if (scanned == 1) return i; if (scanned > 1) { // TBD about extra data found return i; } // TBD failed to scan; return 0; } int main(int argc, char *argv[]) { if (argc > 1) { int64_t i = S64(argv[1]); printf("%" SCNd64 "/n", i); } return 0; }


strtoll convierte en un long long que suele ser un int de 64 bits.