#include <stdio.h>
#include <string.h>
#include <ctype.h>
#if (__BORLANDC__ <= 0x460) || !defined(__cplusplus)
typedef enum { false, true } bool;
#endif
// Funcao que testa se uma string possui apenas digitos validos p/
// um numero, e que esteja no formato [s][[#][.[#]]][#[e[s]#]]
// por ex.:
// 1, +1, -1, 1.1, 1e10, 1e-10, 1.e10, 1.1e10 - Validos
// .1., 1e0.1, -+1, +, -, ., 1+1 - Invalidos
bool IsNumber(char *str)
{
int c = 0;
bool valid = false;
// Verifica sinal
if(str[c] == '-' || str[c] == '+') c++;
// Verifica ponto decimal
if(isdigit(str[c]) || str[c] == '.')
{
valid = true;
// Se comecar com ponto decimal, deve haver pelo
// menos digito, e nao pode terminar com ponto
if(str[c] == '.')
{
c++;
// Se nao possui digitos, esta errado
if(isdigit(str[c]))
{
while(isdigit(str[c])) c++;
// Nao pode haver outro ponto
valid = str[c] != '.';
}
else
valid = false;
}
// Se parte inteira esta OK
if(valid)
{
// Verifica digitos antes do ponto decimal
while(isdigit(str[c])) c++;
// Verifica ponto decimal
if(str[c] == '.') c++;
// Verificia digitos apos o ponto decimal
while(isdigit(str[c])) c++;
// Verifica 'e' p/ potencia de 10
if(tolower(str[c]) == 'e')
{
c++;
// Deve existir digitos
if(str[c] == '\0')
valid = false;
else
{
// Verifica sinal da pontencia de 10
if((str[c] == '-') || (str[c] == '+')) c++;
// Deve haver digito apos o sinal
if(str[c] == '\0')
valid = false;
else
{
while(isdigit(str[c])) c++;
valid = str[c] == '\0';
}
}
}
else
valid = str[c] == '\0';
}
}
return valid;
}
void main()
{
int c;
char str[256];
do
{
printf("> ");
gets(str);
if(IsNumber(str))
printf("Numero valido.\n");
else
printf("Nao e um numero valido.\n");
} while(strlen(str));
}