strtol, strtoll
| Definido en el encabezado <stdlib.h>
|
||
long strtol( const char* str, char** str_end, int base );
|
(1) | (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 );
|
(2) | (desde C99) |
Interpreta un valor entero en una cadena de bytes apuntada por str.
Descarta cualquier carácter de espacio en blanco (identificado mediante la llamada a isspace) hasta que se encuentra el primer carácter que no es espacio en blanco, luego toma tantos caracteres como sea posible para formar una representación numérica entera válida base-n (donde n=base) y los convierte a 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 (se aplica solo cuando la base es8o0) - (opcional) prefijo (
0xo0X) que indica base hexadecimal (se aplica solo cuando la base es16o0) - 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 en base-2 es {0, 1}, para enteros en 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 un entero en base-11, hasta Zz para un entero en base-36. Se ignora el caso de los caracteres.
El locale C instalado actualmente puede aceptar formatos numéricos adicionales.
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 formó parte de la secuencia de entrada, el valor numérico calculado a partir de la secuencia de dígitos se niega como si se aplicara un menos unario en el tipo de resultado.
Las funciones establecen el puntero apuntado por str_end para que apunte al carácter posterior al último carácter numérico interpretado. Si str_end es un puntero nulo, se ignora.
Si la str está vacía o no tiene la forma esperada, 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.
Parámetros
| str | - | puntero a la cadena de bytes terminada en nulo que se va a 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 queda fuera del rango del tipo de retorno correspondiente, se produce un error de rango (estableciendo errno a ERANGE) y se devuelve LONG_MAX, LONG_MIN, LLONG_MAX o LLONG_MIN (según el signo del valor y el tipo de retorno).
- 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)
{
// 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));
}
Posible salida:
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.24.1.7 Las funciones strtol, strtoll, strtoul y strtoull (p: 362-363)
- 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
| |