strtol, strtoll
|
Défini dans l'en-tête
<stdlib.h>
|
||
|
long
strtol
(
const
char
*
str,
char
**
str_end,
int
base
)
;
|
(jusqu'à C99) | |
|
long
strtol
(
const
char
*
restrict
str,
char
**
restrict
str_end,
int
base
)
;
|
(depuis C99) | |
|
long
long
strtoll
(
const
char
*
restrict
str,
char
**
restrict
str_end,
int
base
)
;
|
(depuis C99) | |
Interprète une valeur entière dans une chaîne d'octets pointée par str .
Ignore tous les caractères d'espacement (identifiés en appelant
isspace
) 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 en
base-n
(où n=
base
) et les convertit en une valeur entière. La valeur entière valide se compose des parties suivantes :
- (optionnel) signe plus ou moins
-
(optionnel)
préfixe (
0) indiquant la base octale (s'applique uniquement lorsque la base est 8 ou 0 ) -
(optionnel)
préfixe (
0xou0X) indiquant la base hexadécimale (s'applique uniquement lorsque la base est 16 ou 0 ) - une séquence de chiffres
L'ensemble des valeurs valides pour la base est
{0, 2, 3, ..., 36}
. L'ensemble des chiffres valides pour les entiers en base
2
est
{0, 1}
, pour les entiers en base
3
est
{0, 1, 2}
, et ainsi de suite. Pour les bases supérieures à
10
, les chiffres valides incluent des caractères alphabétiques, commençant par
Aa
pour les entiers en base
11
, jusqu'à
Zz
pour les entiers en base
36
. La casse des caractères est ignorée.
Des formats numériques supplémentaires peuvent être acceptés par la locale C actuellement installée.
Si la valeur de
base
est
0
, la base numérique est auto-détectée : si le préfixe est
0
, la base est octale, si le préfixe est
0x
ou
0X
, la base est hexadécimale, sinon la base est décimale.
Si le signe moins faisait partie de la séquence d'entrée, la valeur numérique calculée à partir de la séquence de chiffres est niée comme si par un moins unaire dans le type de résultat.
Les fonctions définissent le pointeur pointé par str_end pour pointer vers le caractère suivant le dernier caractère numérique interprété. Si str_end est un pointeur nul, il est ignoré.
Si la str est vide ou ne présente pas la forme attendue, aucune conversion n'est effectuée, et (si str_end n'est pas un pointeur nul) la valeur de str est stockée dans l'objet pointé par str_end .
Table des matières |
Paramètres
| str | - | pointeur vers la chaîne d'octets terminée par un caractère nul à interpréter |
| str_end | - | pointeur vers un pointeur de caractère |
| base | - | base de la valeur entière interprétée |
Valeur de retour
- Si l'opération réussit, une valeur entière correspondant au contenu de str est retournée.
- Si la valeur convertie dépasse la plage du type de retour correspondant, une erreur de dépassement se produit (en définissant errno à ERANGE ) et LONG_MAX , LONG_MIN , LLONG_MAX ou LLONG_MIN est retourné.
- Si aucune conversion ne peut être effectuée, 0 est retourné.
Exemple
#include <errno.h> #include <limits.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> int main(void) { // parsing with error handling const char* p = "10 200000000000000000000000000000 30 -40 junk"; printf("Parsing '%s':\n", p); for (;;) { // errno can be set to any non-zero value by a library function call // regardless of whether there was an error, so it needs to be cleared // in order to check the error set by strtol errno = 0; char* end; const long i = strtol(p, &end, 10); if (p == end) break; const bool range_error = errno == ERANGE; printf("Extracted '%.*s', strtol returned %ld.", (int)(end-p), p, i); p = end; if (range_error) printf("\n --> Range error occurred."); putchar('\n'); } printf("Unextracted leftover: '%s'\n\n", p); // parsing without error handling printf("\"1010\" in binary --> %ld\n", strtol("1010", NULL, 2)); printf("\"12\" in octal --> %ld\n", strtol("12", NULL, 8)); printf("\"A\" in hex --> %ld\n", strtol("A", NULL, 16)); printf("\"junk\" in base-36 --> %ld\n", strtol("junk", NULL, 36)); printf("\"012\" in auto-detected base --> %ld\n", strtol("012", NULL, 0)); printf("\"0xA\" in auto-detected base --> %ld\n", strtol("0xA", NULL, 0)); printf("\"junk\" in auto-detected base --> %ld\n", strtol("junk", NULL, 0)); }
Sortie possible :
Parsing '10 200000000000000000000000000000 30 -40 junk': Extracted '10', strtol returned 10. Extracted ' 200000000000000000000000000000', strtol returned 9223372036854775807. --> Range error occurred. Extracted ' 30', strtol returned 30. Extracted ' -40', strtol returned -40. Unextracted leftover: ' junk' "1010" in binary --> 10 "12" in octal --> 10 "A" in hex --> 10 "junk" in base-36 --> 926192 "012" in auto-detected base --> 10 "0xA" in auto-detected base --> 10 "junk" in auto-detected base --> 0
Références
- Norme C23 (ISO/IEC 9899:2024):
-
- 7.22.1.4 Les fonctions strtol, strtoll, strtoul et strtoull (p: À DÉTERMINER)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.22.1.4 Les fonctions strtol, strtoll, strtoul et strtoull (p: 251-252)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.22.1.4 Les fonctions strtol, strtoll, strtoul et strtoull (p: 344-345)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.20.1.4 Les fonctions strtol, strtoll, strtoul et strtoull (p: 310-311)
- Norme C89/C90 (ISO/IEC 9899:1990) :
-
- 4.10.1.5 La fonction strtol
Voir aussi
|
(C99)
|
convertit une chaîne d'octets en une valeur entière
(fonction) |
|
(C99)
|
convertit une chaîne d'octets en une valeur entière non signée
(fonction) |
|
(C95)
(C99)
|
convertit une chaîne large en une valeur entière
(fonction) |
|
(C95)
(C99)
|
convertit une chaîne large en une valeur entière non signée
(fonction) |
|
Documentation C++
pour
strtol
,
strtoll
|
|