tipos - validar que solo ingrese numeros enteros en c++
Determine si una cadena es un entero o un flotador en ANSI C (9)
Supongo que podrías pasar por la cuerda y verificar si hay alguna .
personajes en ella. Sin embargo, eso fue lo primero que me vino a la mente, así que estoy seguro de que hay otras (mejores) formas de estar más seguro.
Usando solo ANSI C, ¿cuál es la mejor manera de determinar con certeza si una cadena de estilo C es un número entero o un número real (es decir, flotante / doble)?
atoi y atof convertirán o devolverán un 0 si no pueden.
Estoy de acuerdo con Patrick_O en que las funciones strto {l, ul, ull, ll, d} son la mejor manera de hacerlo. Sin embargo, hay un par de puntos para mirar.
- Establezca errno en cero antes de llamar a las funciones; ninguna función lo hace por ti.
- La página de Open Group vinculada a (a la que asistí antes de notar que Patrick también se había vinculado) señala que es posible que no se haya establecido errno. Está configurado para ERROR si el valor está fuera de rango; se puede establecer (pero igualmente, no se puede establecer) en EINVAL si el argumento no es válido.
Dependiendo del trabajo en cuestión, a veces me las arreglo para omitir el espacio en blanco al final del puntero de conversión devuelto, y luego me quejo (rechazo) si el último carácter no es el nulo de terminación ''/ 0''. O puedo ser descuidado y dejar que la basura aparezca al final, o puedo aceptar multiplicadores opcionales como ''K'', ''M'', ''G'', ''T'' para kilobytes, megabytes, gigabytes, terabytes, ... o cualquier otro requisito basado en el contexto.
Realmente depende de por qué estás preguntando en primer lugar.
Si solo quieres analizar un número y no sabes si es un flotante o un entero, entonces simplemente analiza un flotador, también analizará correctamente un entero.
Si realmente quiere saber el tipo, tal vez para el triage, entonces debería considerar probar los tipos en el orden que considere más relevante. Como intentar analizar un entero y si no puedes, entonces intenta analizar un flotador. (A la inversa solo producirá un poco más de flotadores ...)
Usando sscanf , puede estar seguro si la cadena es un flotante o int o lo que sea sin tener que tener el caso especial 0, como es el caso con la solución atoi y atof.
Aquí hay un código de ejemplo:
int i;
float f;
if(sscanf(str, "%d", &i) != 0) //It''s an int.
...
if(sscanf(str "%f", &f) != 0) //It''s a float.
...
atoi y atof convertirán el número incluso si hay caracteres no numéricos finales. Sin embargo, si usa strtol y strtod, no solo omitirá el espacio en blanco inicial y un signo opcional, sino que le dejará un puntero al primer carácter que no esté en el número. Entonces puedes verificar que el resto sea un espacio en blanco.
Use strtol / strtoll (no atoi) para verificar los enteros. Use strtof / strtod (no atof) para verificar los dobles.
atoi y atof convierten la parte inicial de la cadena, pero no te dicen si usaron toda la cadena o no. strtol / strtod te dice si hubo basura extra después de que los personajes se convirtieron.
Por lo tanto, en ambos casos, recuerde pasar un parámetro TAIL no nulo y verifique que apunta al final de la cadena (es decir, ** TAIL == 0). También verifique el valor de retorno para subdesbordamiento y desbordamiento (consulte las páginas man o el estándar ANSI para obtener más información).
Tenga en cuenta también que strod / strtol omite espacios en blanco iniciales, por lo que si desea tratar cadenas con espacios en blanco iniciales mal formateados, también debe verificar el primer carácter.
No use atoi ni atof ya que estas funciones devuelven 0 cuando falla. La última vez que marqué 0 es un número entero válido y flotante, por lo tanto, no se usa para determinar el tipo.
use las funciones strto {l, ul, ull, ll, d}, ya que estas configuran errno en caso de falla y también informan dónde terminaron los datos convertidos.
strtoul: http://www.opengroup.org/onlinepubs/007908799/xsh/strtoul.html
este ejemplo asume que la cadena contiene un solo valor para ser convertido.
#include <errno.h>
char* to_convert = "some string";
char* p = to_convert;
errno = 0;
unsigned long val = strtoul(to_convert, &p, 10);
if (errno != 0)
// conversion failed (EINVAL, ERANGE)
if (to_convert == p)
// conversion failed (no characters consumed)
if (*p != 0)
// conversion failed (trailing data)
Gracias a Jonathan Leffler por señalar que olvidé establecer errno en 0 primero.
Bueno, si no tiene ganas de usar una nueva función como strtoul, podría simplemente agregar otra instrucción strcmp para ver si la cadena es 0.
es decir
if(atof(token) != NULL || strcmp(token, "0") == 0)