std:: atoi, std:: atol, std:: atoll
|
Défini dans l'en-tête
<cstdlib>
|
||
|
int
atoi
(
const
char
*
str
)
;
|
(1) | |
|
long
atol
(
const
char
*
str
)
;
|
(2) | |
|
long
long
atoll
(
const
char
*
str
)
;
|
(3) | (depuis C++11) |
Interprète une valeur entière dans une chaîne d'octets pointée par str . La base implicite est toujours 10.
Ignore tous les caractères d'espacement jusqu'à ce que le premier caractère non-espace soit trouvé, puis prend autant de caractères que possible pour former une représentation valide de nombre entier et les convertit en une valeur entière. La valeur entière valide se compose des parties suivantes :
- (optionnel) signe plus ou moins
- chiffres numériques
Si la valeur du résultat ne peut pas être représentée, c'est-à-dire si la valeur convertie sort de la plage du type de retour correspondant, le comportement est indéfini.
Table des matières |
Paramètres
| str | - | pointeur vers la chaîne d'octets terminée par un caractère nul à interpréter |
Valeur de retour
Valeur entière correspondant au contenu de str en cas de succès.
Si aucune conversion ne peut être effectuée, 0 est retourné.
Implémentation possible
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; // calcul en négatifs pour supporter 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); } |
Les implémentations actuelles des bibliothèques C++ se rabattent sur les implémentations de la bibliothèque C pour
atoi
,
atoil
, et
atoll
, qui soit l'implémentent directement (comme dans
MUSL libc
) soit délèguent à
strtol
/
strtoll
(comme dans
GNU libc
).
Exemple
#include <cstdlib> #include <iostream> int main() { const auto data = { "42", "0x2A", // traité comme "0" et déchet "x2A", pas comme hexadécimal "3.14159", "31337 with words", "words and 2", "-012345", "10000000000" // note : hors de la plage int32_t }; 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'; } }
Sortie possible :
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
Voir aussi
|
(C++11)
(C++11)
(C++11)
|
convertit une chaîne en entier signé
(fonction) |
|
(C++11)
(C++11)
|
convertit une chaîne en entier non signé
(fonction) |
|
(C++11)
|
convertit une chaîne d'octets en valeur entière
(fonction) |
|
(C++11)
|
convertit une chaîne d'octets en valeur entière non signée
(fonction) |
|
(C++11)
(C++11)
|
convertit une chaîne d'octets en
std::intmax_t
ou
std::uintmax_t
(fonction) |
|
(C++17)
|
convertit une séquence de caractères en valeur entière ou virgule flottante
(fonction) |
|
Documentation C
pour
atoi
,
atol
,
atoll
|
|