Namespaces
Variants

std:: atoi, std:: atol, std:: atoll

From cppreference.net
Definiert im Header <cstdlib>
int atoi ( const char * str ) ;
(1)
long atol ( const char * str ) ;
(2)
long long atoll ( const char * str ) ;
(3) (seit C++11)

Interpretiert einen ganzzahligen Wert in der Byte-Zeichenkette, auf die str zeigt. Die implizite Basis ist immer 10.

Verwirft alle Leerzeichen, bis das erste Nicht-Leerzeichen gefunden wird, nimmt dann so viele Zeichen wie möglich, um eine gültige Ganzzahldarstellung zu bilden, und wandelt sie in einen ganzzahligen Wert um. Der gültige ganzzahlige Wert besteht aus den folgenden Teilen:

  • (optional) Plus- oder Minuszeichen
  • numerische Ziffern

Wenn der Wert des Ergebnisses nicht dargestellt werden kann, d.h. der konvertierte Wert außerhalb des Bereichs des entsprechenden Rückgabetyps liegt, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Parameter

str - Zeiger auf die nullterminierte Byte-Zeichenkette, die interpretiert werden soll

Rückgabewert

Integer-Wert entsprechend dem Inhalt von str bei Erfolg.

Wenn keine Konvertierung durchgeführt werden kann, 0 wird zurückgegeben.

Mögliche Implementierung

template<typename T>
T atoi_impl(const char* str)
{
    while (std::isspace(static_cast<unsigned char>(*str)))
        ++str;
    bool negative = false;
    if (*str == '+')
        ++str;
    else if (*str == '-')
    {
        ++str;
        negative = true;
    }
    T result = 0;
    for (; std::isdigit(static_cast<unsigned char>(*str)); ++str)
    {
        int digit = *str - '0';
        result *= 10;
        result -= digit; // Berechnung in Negativen zur Unterstützung von INT_MIN, LONG_MIN,..
    }
    return negative ? result : -result;
}
int atoi(const char* str)
{
    return atoi_impl<int>(str);
}
long atol(const char* str)
{
    return atoi_impl<long>(str);
}
long long atoll(const char* str)
{
    return atoi_impl<long long>(str);
}

Tatsächliche C++-Bibliotheksimplementierungen greifen auf C-Bibliotheksimplementierungen von atoi , atoil und atoll zurück, die es entweder direkt implementieren (wie in MUSL libc ) oder an strtol / strtoll delegieren (wie in GNU libc ).

Beispiel

#include <cstdlib>
#include <iostream>
int main()
{
    const auto data =
    {
        "42",
        "0x2A", // behandelt als "0" und Junk "x2A", nicht als hexadezimal
        "3.14159",
        "31337 with words",
        "words and 2",
        "-012345",
        "10000000000" // Hinweis: außerhalb des int32_t-Bereichs
    };
    for (const char* s : data)
    {
        const int i{std::atoi(s)};
        std::cout << "std::atoi('" << s << "') is " << i << '\n';
        if (const long long ll{std::atoll(s)}; i != ll)
            std::cout << "std::atoll('" << s << "') is " << ll << '\n';
    }
}

Mögliche Ausgabe:

std::atoi('42') is 42
std::atoi('0x2A') is 0
std::atoi('3.14159') is 3
std::atoi('31337 with words') is 31337
std::atoi('words and 2') is 0
std::atoi('-012345') is -12345
std::atoi('10000000000') is 1410065408
std::atoll('10000000000') is 10000000000

Siehe auch

(C++11) (C++11) (C++11)
wandelt eine Zeichenkette in eine vorzeichenbehaftete Ganzzahl um
(Funktion)
(C++11) (C++11)
wandelt eine Zeichenkette in eine vorzeichenlose Ganzzahl um
(Funktion)
wandelt eine Byte-Zeichenkette in einen Ganzzahlwert um
(Funktion)
wandelt eine Byte-Zeichenkette in einen vorzeichenlosen Ganzzahlwert um
(Funktion)
(C++11) (C++11)
wandelt eine Byte-Zeichenkette in std::intmax_t oder std::uintmax_t um
(Funktion)
(C++17)
wandelt eine Zeichenfolge in einen Ganzzahl- oder Gleitkommawert um
(Funktion)
C-Dokumentation für atoi , atol , atoll