Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | string‎ | byte
 
 
 
 
Definiert in 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 einer 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 auf, um eine gültige Ganzzahl darzustellen, und konvertiert sie in einen ganzzahligen Wert. Der gültige Ganzzahlwert besteht aus den folgenden Teilen:

  • (optional) Vorzeichen (+ oder -)
  • 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.

Inhalt

[bearbeiten] Parameter

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

[bearbeiten] Rückgabewert

Ganzzahliger Wert, der dem Inhalt von str bei Erfolg entspricht.

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

[bearbeiten] 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; // calculate in negatives to support 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 diese entweder direkt implementieren (wie in MUSL libc) oder an strtol/strtoll delegieren (wie in GNU libc).

[bearbeiten] Beispiel

#include <cstdlib>
#include <iostream>
 
int main()
{
    const auto data =
    {
        "42",
        "0x2A", // treated as "0" and junk "x2A", not as hexadecimal
        "3.14159",
        "31337 with words",
        "words and 2",
        "-012345",
        "10000000000" // note: out of int32_t range
    };
 
    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

[bearbeiten] Siehe auch

(C++11)(C++11)(C++11)
konvertiert einen String in eine vorzeichenbehaftete Ganzzahl
(function) [edit]
(C++11)(C++11)
konvertiert einen String in eine vorzeichenlose Ganzzahl
(function) [edit]
konvertiert einen Byte-String in einen Ganzzahlwert
(Funktion) [bearbeiten]
konvertiert einen Byte-String in einen vorzeichenlosen Ganzzahlwert
(Funktion) [bearbeiten]
(C++11)(C++11)
konvertiert einen Byte-String in std::intmax_t oder std::uintmax_t
(Funktion) [bearbeiten]
konvertiert eine Zeichensequenz in einen Ganzzahl- oder Gleitkommawert
(Funktion) [bearbeiten]
C-Dokumentation für atoi, atol, atoll