Por qué no hay strtoi en stdlib.h?
A principios de C, no había firmado un tipo estándar más ancha que long
y todas las conversiones más estrechos se podría hacer de strtol()
- como se hace a continuación.
IMO, estas y sus contrapartes unsigned
ahora faltan funciones C y un defecto de diseño en la biblioteca C estándar actual.
En muchos sistemas, long
y int
tienen el mismo rango y por lo tanto hay una necesidad reducida de un strtoi()
separada. Además, el atoi()
satisface la necesidad de un código rápido y sucio, pero puede carecer de detección de errores. Tampoco hay un strto_short()
ni strto_signchar()
, etc.
Es bastante fácil crear un sustituto strtoi()
. Simplificaciones existen
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
static long strto_subrange(const char *s, char **endptr, int base,
long min, long max) {
long y = strtol(s, endptr, base);
if (y > max) {
errno = ERANGE;
return max;
}
if (y < min) {
errno = ERANGE;
return min;
}
return y;
}
// OP's goal
int strtoi(const char *s, char **endptr, int base) {
#if INT_MAX == LONG_MAX && INT_MIN == LONG_MIN
return (int) strtol(s, endptr, base);
#else
return (int) strto_subrange(s, endptr, base, INT_MIN, INT_MAX);
#endif
}
short strtoshort(const char *s, char **endptr, int base) {
return (short) strto_subrange(s, endptr, base, SHRT_MIN, SHRT_MAX);
}
signed char strtoschar(const char *s, char **endptr, int base) {
return (signed char) strto_subrange(s, endptr, base, SCHAR_MIN, SCHAR_MAX);
}
Mejora inspirado por @chqrlie
Alguien por favor etiquetar strtoi – Eli
En implementar, glibc, por ejemplo, es también con características de seguridad 'int atoi (const char * nptr) {return (int) strtol (nptr, (char **) NULL, 10);} ' – yuan