strtol, strtoll
|
Definido en el encabezado
<stdlib.h>
|
||
|
long
strtol
(
const
char
*
str,
char
**
str_end,
int
base
)
;
|
(hasta C99) | |
|
long
strtol
(
const
char
*
restrict
str,
char
**
restrict
str_end,
int
base
)
;
|
(desde C99) | |
|
long
long
strtoll
(
const
char
*
restrict
str,
char
**
restrict
str_end,
int
base
)
;
|
(desde C99) | |
Interpreta un valor entero en una cadena de bytes apuntada por str .
Descarta cualquier carácter de espacio en blanco (identificado llamando a
isspace
) hasta encontrar el primer carácter que no sea un espacio, luego toma tantos caracteres como sea posible para formar una representación válida de número entero en
base-n
(donde n=
base
) y los convierte en un valor entero. El valor entero válido consta de las siguientes partes:
- (opcional) signo más o menos
-
(opcional)
prefijo (
0) que indica base octal (solo aplica cuando la base es 8 o 0 ) -
(opcional)
prefijo (
0xo0X) que indica base hexadecimal (solo aplica cuando la base es 16 o 0 ) - una secuencia de dígitos
El conjunto de valores válidos para base es
{0, 2, 3, ..., 36}
. El conjunto de dígitos válidos para enteros de base-
2
es
{0, 1}
, para enteros de base-
3
es
{0, 1, 2}
, y así sucesivamente. Para bases mayores que
10
, los dígitos válidos incluyen caracteres alfabéticos, comenzando desde
Aa
para enteros de base-
11
, hasta
Zz
para enteros de base-
36
. Se ignora la capitalización de los caracteres.
Se pueden aceptar formatos numéricos adicionales según la configuración regional de C actualmente instalada locale .
Si el valor de
base
es
0
, la base numérica se detecta automáticamente: si el prefijo es
0
, la base es octal, si el prefijo es
0x
o
0X
, la base es hexadecimal, de lo contrario la base es decimal.
Si el signo menos formaba parte de la secuencia de entrada, el valor numérico calculado a partir de la secuencia de dígitos se niega como si fuera mediante unary minus en el tipo resultante.
Las funciones establecen el puntero apuntado por str_end para que apunte al carácter después del último carácter numérico interpretado. Si str_end es un puntero nulo, se ignora.
Si la str está vacía o no tiene el formato esperado, no se realiza ninguna conversión, y (si str_end no es un puntero nulo) el valor de str se almacena en el objeto apuntado por str_end .
Contenidos |
Parámetros
| str | - | puntero a la cadena de bytes terminada en nulo que se interpretará |
| str_end | - | puntero a un puntero a carácter |
| base | - | base del valor entero interpretado |
Valor de retorno
- Si tiene éxito, se devuelve un valor entero correspondiente al contenido de str .
- Si el valor convertido está fuera del rango del tipo de retorno correspondiente, ocurre un error de rango (estableciendo errno a ERANGE ) y se devuelve LONG_MAX , LONG_MIN , LLONG_MAX o LLONG_MIN .
- Si no se puede realizar ninguna conversión, se devuelve 0 .
Ejemplo
#include <errno.h> #include <limits.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> int main(void) { // análisis con manejo de errores const char* p = "10 200000000000000000000000000000 30 -40 junk"; printf("Parsing '%s':\n", p); for (;;) { // errno puede establecerse a cualquier valor distinto de cero por una llamada a función de biblioteca // independientemente de si hubo un error, por lo que debe limpiarse // para verificar el error establecido por 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); // análisis sin manejo de errores 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)); }
Salida posible:
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
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 7.22.1.4 Las funciones strtol, strtoll, strtoul y strtoull (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.22.1.4 Las funciones strtol, strtoll, strtoul y strtoull (p: 251-252)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.22.1.4 Las funciones strtol, strtoll, strtoul y strtoull (p: 344-345)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.20.1.4 Las funciones strtol, strtoll, strtoul y strtoull (p: 310-311)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 4.10.1.5 La función strtol
Véase también
|
(C99)
|
convierte una cadena de bytes a un valor entero
(función) |
|
(C99)
|
convierte una cadena de bytes a un valor entero sin signo
(función) |
|
(C95)
(C99)
|
convierte una cadena ancha a un valor entero
(función) |
|
(C95)
(C99)
|
convierte una cadena ancha a un valor entero sin signo
(función) |
|
Documentación de C++
para
strtol
,
strtoll
|
|