#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));
}
1