Namespaces
Variants

std:: strtol, std:: strtoll

From cppreference.net
Definido en el encabezado <cstdlib>
long strtol ( const char * str, char ** str_end, int base ) ;
(1)
long long strtoll ( const char * str, char ** str_end, int base ) ;
(2) (desde C++11)

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

Descarta cualquier carácter de espacio en blanco (identificado llamando a std::isspace ) hasta encontrar el primer carácter que no sea un espacio en blanco, 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 de resultado.

La función establece el puntero apuntado por str_end para que apunte al carácter posterior al último carácter 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 <cerrno>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <string>
int main()
{
    const char* p = "10 200000000000000000000000000000 30 -40";
    std::cout << "Parsing " << std::quoted(p) << ":\n";
    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* p_end{};
        const long i = std::strtol(p, &p_end, 10);
        if (p == p_end)
            break;
        const bool range_error = errno == ERANGE;
        const std::string extracted(p, p_end - p);
        p = p_end;
        std::cout << "Extracted " << std::quoted(extracted)
                  << ", strtol returned " << i << '.';
        if (range_error)
            std::cout << "\n  Range error occurred.";
        std::cout << '\n';
    }
}

Salida posible:

Parsing "10 200000000000000000000000000000 30 -40":
Extracted "10", strtol returned 10.
Extracted " 200000000000000000000000000000", strtol returned 9223372036854775807.
  Range error occurred.
Extracted " 30", strtol returned 30.
Extracted " -40", strtol returned -40.

Véase también

(C++11) (C++11) (C++11)
convierte una cadena a un entero con signo
(función)
convierte una cadena de bytes a un valor entero sin signo
(función)
(C++11) (C++11)
convierte una cadena de bytes a std::intmax_t o std::uintmax_t
(función)
convierte una cadena ancha a un valor entero
(función)
convierte una cadena de bytes a un valor de punto flotante
(función)
(C++17)
convierte una secuencia de caracteres a un valor entero o de punto flotante
(función)
convierte una cadena de bytes a un valor entero
(función)
Documentación de C para strtol , strtoll