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