Namespaces
Variants

strtol, strtoll

From cppreference.net
< c ‎ | string ‎ | byte
Definido en el encabezado <stdlib.h>
long strtol ( const char * str, char ** str_end, int base ) ;
(hasta C99)
long strtol ( const char * restrict str, char ** restrict str_end, int base ) ;
(desde C99)
long long strtoll ( const char * restrict str, char ** restrict str_end, int base ) ;
(desde C99)

Interpreta un valor entero en una cadena de bytes apuntada por str .

Descarta cualquier carácter de espacio en blanco (identificado llamando a isspace ) hasta encontrar el primer carácter que no sea un espacio, luego toma tantos caracteres como sea posible para formar una representación válida de número entero en base-n (donde n= base ) y los convierte en un valor entero. El valor entero válido consta de las siguientes partes:

  • (opcional) signo más o menos
  • (opcional) prefijo ( 0 ) que indica base octal (solo aplica cuando la base es 8 o 0 )
  • (opcional) prefijo ( 0x o 0X ) que indica base hexadecimal (solo aplica cuando la base es 16 o 0 )
  • una secuencia de dígitos

El conjunto de valores válidos para base es {0, 2, 3, ..., 36} . El conjunto de dígitos válidos para enteros de base- 2 es {0, 1} , para enteros de base- 3 es {0, 1, 2} , y así sucesivamente. Para bases mayores que 10 , los dígitos válidos incluyen caracteres alfabéticos, comenzando desde Aa para enteros de base- 11 , hasta Zz para enteros de base- 36 . Se ignora la capitalización de los caracteres.

Se pueden aceptar formatos numéricos adicionales según la configuración regional de C actualmente instalada locale .

Si el valor de base es 0 , la base numérica se detecta automáticamente: si el prefijo es 0 , la base es octal, si el prefijo es 0x o 0X , la base es hexadecimal, de lo contrario la base es decimal.

Si el signo menos formaba parte de la secuencia de entrada, el valor numérico calculado a partir de la secuencia de dígitos se niega como si fuera mediante unary minus en el tipo resultante.

Las funciones establecen el puntero apuntado por str_end para que apunte al carácter después del último carácter numérico interpretado. Si str_end es un puntero nulo, se ignora.

Si la str está vacía o no tiene el formato esperado, no se realiza ninguna conversión, y (si str_end no es un puntero nulo) el valor de str se almacena en el objeto apuntado por str_end .

Contenidos

Parámetros

str - puntero a la cadena de bytes terminada en nulo que se interpretará
str_end - puntero a un puntero a carácter
base - base del valor entero interpretado

Valor de retorno

  • Si tiene éxito, se devuelve un valor entero correspondiente al contenido de str .
  • Si el valor convertido está fuera del rango del tipo de retorno correspondiente, ocurre un error de rango (estableciendo errno a ERANGE ) y se devuelve LONG_MAX , LONG_MIN , LLONG_MAX o LLONG_MIN .
  • Si no se puede realizar ninguna conversión, se devuelve 0 .

Ejemplo

#include <errno.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    // análisis con manejo de errores
    const char* p = "10 200000000000000000000000000000 30 -40 junk";
    printf("Parsing '%s':\n", p);
    for (;;)
    {
        // errno puede establecerse a cualquier valor distinto de cero por una llamada a función de biblioteca
        // independientemente de si hubo un error, por lo que debe limpiarse
        // para verificar el error establecido por strtol
        errno = 0;
        char* end;
        const long i = strtol(p, &end, 10);
        if (p == end)
            break;
        const bool range_error = errno == ERANGE;
        printf("Extracted '%.*s', strtol returned %ld.", (int)(end-p), p, i);
        p = end;
        if (range_error)
            printf("\n --> Range error occurred.");
        putchar('\n');
    }
    printf("Unextracted leftover: '%s'\n\n", p);
    // análisis sin manejo de errores
    printf("\"1010\" in binary  --> %ld\n", strtol("1010", NULL, 2));
    printf("\"12\"   in octal   --> %ld\n", strtol("12",   NULL, 8));
    printf("\"A\"    in hex     --> %ld\n", strtol("A",    NULL, 16));
    printf("\"junk\" in base-36 --> %ld\n", strtol("junk", NULL, 36));
    printf("\"012\"  in auto-detected base --> %ld\n", strtol("012",  NULL, 0));
    printf("\"0xA\"  in auto-detected base --> %ld\n", strtol("0xA",  NULL, 0));
    printf("\"junk\" in auto-detected base --> %ld\n", strtol("junk", NULL, 0));
}

Salida posible:

Parsing '10 200000000000000000000000000000 30 -40 junk':
Extracted '10', strtol returned 10.
Extracted ' 200000000000000000000000000000', strtol returned 9223372036854775807.
 --> Range error occurred.
Extracted ' 30', strtol returned 30.
Extracted ' -40', strtol returned -40.
Unextracted leftover: ' junk'
"1010" in binary  --> 10
"12"   in octal   --> 10
"A"    in hex     --> 10
"junk" in base-36 --> 926192
"012"  in auto-detected base --> 10
"0xA"  in auto-detected base --> 10
"junk" in auto-detected base --> 0

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.22.1.4 Las funciones strtol, strtoll, strtoul y strtoull (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.22.1.4 Las funciones strtol, strtoll, strtoul y strtoull (p: 251-252)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.22.1.4 Las funciones strtol, strtoll, strtoul y strtoull (p: 344-345)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.20.1.4 Las funciones strtol, strtoll, strtoul y strtoull (p: 310-311)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.10.1.5 La función strtol

Véase también

convierte una cadena de bytes a un valor entero
(función)
convierte una cadena de bytes a un valor entero sin signo
(función)
(C95) (C99)
convierte una cadena ancha a un valor entero
(función)
(C95) (C99)
convierte una cadena ancha a un valor entero sin signo
(función)
Documentación de C++ para strtol , strtoll