Namespaces
Variants

std:: stoi, std:: stol, std:: stoll

From cppreference.net
std::basic_string
Definido en el encabezado <string>
int stoi ( const std:: string & str,
std:: size_t * pos = nullptr, int base = 10 ) ;
(1) (desde C++11)
int stoi ( const std:: wstring & str,
std:: size_t * pos = nullptr, int base = 10 ) ;
(2) (desde C++11)
long stol ( const std:: string & str,
std:: size_t * pos = nullptr, int base = 10 ) ;
(3) (desde C++11)
long stol ( const std:: wstring & str,
std:: size_t * pos = nullptr, int base = 10 ) ;
(4) (desde C++11)
long long stoll ( const std:: string & str,
std:: size_t * pos = nullptr, int base = 10 ) ;
(5) (desde C++11)
long long stoll ( const std:: wstring & str,
std:: size_t * pos = nullptr, int base = 10 ) ;
(6) (desde C++11)

Interpreta un valor entero con signo en la cadena str .

Sea ptr un puntero interno (a las funciones de conversión) de tipo char * (1,3,5) o wchar_t * (2,4,6) , respectivamente.

1) Llama a std:: strtol ( str. c_str ( ) , & ptr, base ) .
2) Llama std:: wcstol ( str. c_str ( ) , & ptr, base ) .
3) Llama a std:: strtol ( str. c_str ( ) , & ptr, base ) .
4) Llama a std:: wcstol ( str. c_str ( ) , & ptr, base ) .
5) Llama std:: strtoll ( str. c_str ( ) , & ptr, base ) .
6) Llama a std:: wcstoll ( str. c_str ( ) , & ptr, base ) .

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.

Si pos no es un puntero nulo, entonces ptr recibirá la dirección del primer carácter no convertido en str. c_str ( ) , y el índice de ese carácter será calculado y almacenado en * pos , indicando el número de caracteres que fueron procesados por la conversión.

Contenidos

Parámetros

str - la cadena a convertir
pos - dirección de un entero para almacenar el número de caracteres procesados
base - la base numérica

Valor de retorno

Valor entero correspondiente al contenido de str .

Excepciones

Ejemplo

#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <string>
#include <utility>
int main()
{
    const auto data =
    {
        "45",
        "+45",
        " -45",
        "3.14159",
        "31337 with words",
        "words and 2",
        "12345678901",
    };
    for (const std::string s : data)
    {
        std::size_t pos{};
        try
        {
            std::cout << "std::stoi(" << std::quoted(s) << "): ";
            const int i{std::stoi(s, &pos)};
            std::cout << i << "; pos: " << pos << '\n';
        }
        catch (std::invalid_argument const& ex)
        {
            std::cout << "std::invalid_argument::what(): " << ex.what() << '\n';
        }
        catch (std::out_of_range const& ex)
        {
            std::cout << "std::out_of_range::what(): " << ex.what() << '\n';
            const long long ll{std::stoll(s, &pos)};
            std::cout << "std::stoll(" << std::quoted(s) << "): " << ll
                      << "; pos: " << pos << '\n';
        }
    }
    std::cout << "\nCalling with different radixes:\n";
    for (const auto& [s, base] : {std::pair<const char*, int>
        {"11",  2}, {"22",  3}, {"33",  4}, {"77",  8},
        {"99", 10}, {"FF", 16}, {"jJ", 20}, {"Zz", 36}})
    {
        const int i{std::stoi(s, nullptr, base)};
        std::cout << "std::stoi(" << std::quoted(s)
                  << ", nullptr, " << base << "): " << i << '\n';
    }
}

Salida posible:

std::stoi("45"): 45; pos: 2
std::stoi("+45"): 45; pos: 3
std::stoi(" -45"): -45; pos: 4
std::stoi("3.14159"): 3; pos: 1
std::stoi("31337 with words"): 31337; pos: 5
std::stoi("words and 2"): std::invalid_argument::what(): stoi
std::stoi("12345678901"): std::out_of_range::what(): stoi
std::stoll("12345678901"): 12345678901; pos: 11
Calling with different radixes:
std::stoi("11", nullptr, 2): 3
std::stoi("22", nullptr, 3): 8
std::stoi("33", nullptr, 4): 15
std::stoi("77", nullptr, 8): 63
std::stoi("99", nullptr, 10): 99
std::stoi("FF", nullptr, 16): 255
std::stoi("jJ", nullptr, 20): 399
std::stoi("Zz", nullptr, 36): 1295

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2009 C++11 std::out_of_range no sería lanzado si
std::strtol o std::strtoll establece errno a ERANGE
lanzará

Véase también

(C++11) (C++11)
convierte una cadena a un entero sin signo
(función)
(C++11) (C++11) (C++11)
convierte una cadena a un valor de punto flotante
(funció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)
(C++11) (C++11)
convierte una cadena de bytes a std::intmax_t o std::uintmax_t
(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)
(C++11)
convierte un valor entero o de punto flotante a string
(función)
(C++11)
convierte un valor entero o de punto flotante a wstring
(función)