stod stdlib functions convertir cadena c std strtod

stdlib - strtod c



¿Por qué no hay strtoi en stdlib.h? (6)

¿Por qué no hay strtoi en stdlib.h?

En C inicial, no había un tipo estándar firmado más ancho que long y todas las conversiones más estrechas se podían hacer desde strtol() - como se hace a continuación.

OMI, estos y sus contrapartes unsigned ahora están perdiendo funciones C y un defecto de diseño en la biblioteca C estándar actual.

En muchos sistemas, long e int tienen el mismo rango, por lo que existe una necesidad reducida de un strtoi() separado. Además, el atoi() la necesidad de un código rápido y sucio, pero puede carecer de detección de errores. Tampoco hay strto_short() ni strto_signchar() , etc.

Es bastante fácil crear un strtoi() 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 inspirada en @chqrlie

Me he acostumbrado a strtod y variantes. Me pregunto por qué no se envía strtoi con stdlib.h. ¿Por qué el número entero queda fuera de este grupo?

Específicamente, estoy preguntando por qué no hay una versión de atoi con las características de seguridad de strtod.


El entero no queda fuera del grupo: strtol , que convierte una cadena en una long , que es un tipo entero.


Es llamado atoi . Ver también Wikipedia para más detalles, incluido su sucesor strol .


Esto es lo que he estado usando.

long long_val; int int_value; errno = 0; long_val = strtol (theString, NULL, 10); if (errno) handle_error; if ((long) someIntMin > long_val || long_val > (long) someIntMax) handle_invalid; int_value = (int) long_val;


No pase por alto la sección SEE ALSO en sus páginas de manual :)

SEE ALSO atof(3), atoi(3), atol(3), strtol(3), strtoul(3)

Usted está buscando atoi(3) . :)


strtol() convierte una cadena en un entero, un entero largo pero un entero, sin embargo. Hay atoi() pero debería evitarse en la mayoría de los casos debido a que carece de un mecanismo para reportar errores a partir de entradas no válidas.