En el caso de C y si la intención es validar solo tipos enteros se puede utilizar la función strtol (prototipo en <stdlib.h>) dejando a esta la mayor parte del trabajo. Por ejemplo:
Para números de tipo flotante se puede tomar una aproximación similar utilizando strtod (prototipo tambien en <stdlib.h>).
Un saludo
Código (c) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
#include <errno.h>
#define NUM_CHARS 256
int validar_int(char const *linea, int *num);
int main(void)
{
char linea[NUM_CHARS];
int num;
printf("Introduce un numero entero (signed int): ");
fflush(stdout);
if (fgets(linea, NUM_CHARS, stdin) == NULL)
return EXIT_FAILURE;
if (validar_int(linea, &num))
printf("OK. El numero es %d\n", num);
else
puts("Error!");
return EXIT_SUCCESS;
}
int validar_int(char const *linea, int *num)
{
char *ch;
long res;
/* Descartamos el ultimo error y tratamos de convertir la linea */
errno = 0;
res = strtol(linea, &ch, 0);
/* A continuacion verificamos ... */
/* ... si al menos un caracter pudo convertirse con exito */
if (res == 0 && ch == linea)
return 0;
/* ... si el numero esta en el rango valido (signed long) */
if (errno == ERANGE && (res == LONG_MAX || res == LONG_MIN))
return 0;
/* ... si el resto de la linea es espacio blanco */
while (isspace(*ch))
ch++;
if (*ch != '\0')
return 0;
/* ... si el numero esta en el rango valido (signed int) */
if (res > INT_MAX || res < INT_MIN)
return 0;
/* Si todo se cumple el numero introducido es valido */
*num = res;
return 1;
}
Para números de tipo flotante se puede tomar una aproximación similar utilizando strtod (prototipo tambien en <stdlib.h>).
Un saludo