Namespaces
Variants

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

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

Interpretiert einen vorzeichenbehafteten Integerwert in der Zeichenkette str .

Sei ptr ein interner (für die Konvertierungsfunktionen) Zeiger vom Typ char * (1,3,5) oder wchar_t * (2,4,6) , entsprechend.

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

Verwirft alle Leerzeichen (wie durch Aufruf von std::isspace identifiziert) bis zum ersten Nicht-Leerzeichen, dann nimmt so viele Zeichen wie möglich, um eine gültige Basis-n (wobei n= base ) Ganzzahldarstellung zu bilden und konvertiert sie in einen Ganzzahlwert. Der gültige Ganzzahlwert besteht aus folgenden Teilen:

  • (optional) Plus- oder Minuszeichen
  • (optional) Präfix ( 0 ) zur Kennzeichnung der Oktalbasis (gilt nur, wenn die Basis 8 oder 0 ist)
  • (optional) Präfix ( 0x oder 0X ) zur Kennzeichnung der Hexadezimalbasis (gilt nur, wenn die Basis 16 oder 0 ist)
  • eine Ziffernfolge

Die Menge der gültigen Werte für die Basis ist {0, 2, 3, ..., 36} . Die Menge der gültigen Ziffern für Basis- 2 -Integer ist {0, 1} , für Basis- 3 -Integer ist {0, 1, 2} , und so weiter. Für Basen größer als 10 umfassen gültige Ziffern alphabetische Zeichen, beginnend mit Aa für Basis- 11 -Integer, bis zu Zz für Basis- 36 -Integer. Die Groß-/Kleinschreibung der Zeichen wird ignoriert.

Zusätzliche numerische Formate können von der aktuell installierten C- Locale akzeptiert werden.

Wenn der Wert von base gleich 0 ist, wird die numerische Basis automatisch erkannt: wenn das Präfix 0 lautet, ist die Basis oktal, wenn das Präfix 0x oder 0X lautet, ist die Basis hexadezimal, andernfalls ist die Basis dezimal.

Wenn das Minuszeichen Teil der Eingabesequenz war, wird der numerische Wert, der aus der Ziffernfolge berechnet wurde, negiert, als ob durch unary minus im Ergebnistyp.

Wenn pos kein Nullzeiger ist, dann erhält ptr die Adresse des ersten nicht konvertierten Zeichens in str. c_str ( ) , und der Index dieses Zeichens wird berechnet und in * pos gespeichert, was die Anzahl der durch die Konvertierung verarbeiteten Zeichen angibt.

Inhaltsverzeichnis

Parameter

str - die zu konvertierende Zeichenkette
pos - Adresse einer Integer-Variablen zur Speicherung der Anzahl verarbeiteter Zeichen
base - die Zahlenbasis

Rückgabewert

Integer-Wert entsprechend dem Inhalt von str .

Exceptions

Beispiel

#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';
    }
}

Mögliche Ausgabe:

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2009 C++11 std::out_of_range würde nicht geworfen, wenn
std::strtol oder std::strtoll errno auf ERANGE setzt
wird werfen

Siehe auch

(C++11) (C++11)
konvertiert eine Zeichenkette in einen vorzeichenlosen Integerwert
(Funktion)
(C++11) (C++11) (C++11)
konvertiert eine Zeichenkette in einen Gleitkommawert
(Funktion)
konvertiert eine Byte-Zeichenkette in einen Integerwert
(Funktion)
konvertiert eine Byte-Zeichenkette in einen vorzeichenlosen Integerwert
(Funktion)
(C++11) (C++11)
konvertiert eine Byte-Zeichenkette zu std::intmax_t oder std::uintmax_t
(Funktion)
(C++17)
konvertiert eine Zeichenfolge in einen Integer- oder Gleitkommawert
(Funktion)
konvertiert eine Byte-Zeichenkette in einen Integerwert
(Funktion)
(C++11)
konvertiert einen Integer- oder Gleitkommawert zu string
(Funktion)
(C++11)
konvertiert einen Integer- oder Gleitkommawert zu wstring
(Funktion)