ampat991 Posted October 29, 2009 at 05:43 PM Report Share #293888 Posted October 29, 2009 at 05:43 PM Olá Eu estava a tentar fazer uma calculadora em C, pedindo na linha de comando dois numeros reais (double's) e a operação a efectuar entre eles. A minha dúvida é a seguinte: como posso verificar se um dado argumento inserido é ou não um número real. Obrigado, ampat991 Link to comment Share on other sites More sharing options...
Baderous Posted October 29, 2009 at 05:53 PM Report Share #293890 Posted October 29, 2009 at 05:53 PM Verificando o valor devolvido pelo scanf aquando da leitura. Se ao leres 1 real, o scanf devolver o valor 1, quer dizer que leu e armazenou com sucesso numa variável (float ou double) o valor que introduziste. Se der outro valor que não 1 (neste caso seria 0), então é porque introduziste algo que não é um real. #include <stdio.h> int main(void) { double p; int r; do { r = scanf("%lf",&p); scanf("%*c"); } while (r<1); printf("%f\n",p); return 0; } Link to comment Share on other sites More sharing options...
ampat991 Posted October 29, 2009 at 06:03 PM Author Report Share #293892 Posted October 29, 2009 at 06:03 PM Eu quero verificar isso para uma string que eu tinha inserido no terminal (porque os valores que inserimos no terminal ficam armazenados como strings). Utilizando o sscanf para isso, ele rejeita strings como "palavra" ou "p8987", mas deixa passar com o valor 1 strings como "98tyy" e diz que leu o valor 98 para este caso. Link to comment Share on other sites More sharing options...
ampat991 Posted October 29, 2009 at 07:18 PM Author Report Share #293904 Posted October 29, 2009 at 07:18 PM alguma ideia? ? Link to comment Share on other sites More sharing options...
Baderous Posted October 29, 2009 at 07:24 PM Report Share #293906 Posted October 29, 2009 at 07:24 PM Hmm não tinha reparado nesse pormenor. Se estiveres em Linux podes tentar usar uma regex para validar o input (doubles): http://www.osix.net/modules/article/?id=349 http://www.gnu.org/s/libc/manual/html_node/Regular-Expressions.html Link to comment Share on other sites More sharing options...
sportingdan Posted October 29, 2009 at 09:11 PM Report Share #293933 Posted October 29, 2009 at 09:11 PM vou responder neste tópico só para que users com a mesma dúvida tenham acesso à informação, visto que já esclareci o ampat991 pessoalmente 😄 Como verificar se um argumento introduzido na linha de comandos é um número real e convertê-lo em caso afirmativo? Tendo em conta que os valores vão ser recebidos através dos argv[], logo sob o formato de strings, tem de se verificar se os mesmos strings são algarismos, ou seja, verificar se os strings inseridos contêm apenas algarismos, pontos (para permitir números decimais), traços (para números ou expoentes de notação científica negativos) e a letra 'e' (que representa o (10^) para números em notação científica). Como sabem, uma string é um conjunto de char's, e a cada char corresponde um determinado código ASCII decimal. Assim, basta verificarem se a string argv[] contém apenas os valores permitidos em ASCII (devem resolver este problema com um ciclo que comece a testar o primeiro caracter da string e acabe no último). Deste modo, devem permitir que possa haver apenas: - algarismos; - um e um só '.' na string, que não pode ser nem o 1.º nem o último caracter da string; (decimais) - um '-' no início da string e outro '-' a seguir ao 'e'; (negativos e expoentes de notação científica negativos) - um e só um 'e', que não pode ser nem o 1.º nem o último caracter da string; (notação científica) Um exemplo para o valor mais "complexo" que devem poder inserir na calculadora é: -2.65e-10 Depois de todos estes testes, estão em condições para proceder à conversão da string para double através da função atof ou strtod. Cumps. Link to comment Share on other sites More sharing options...
ampat991 Posted October 30, 2009 at 06:52 AM Author Report Share #293973 Posted October 30, 2009 at 06:52 AM Já consegui criar o 'filtro' de numeros reias 🙂 Obrigado pela ajuda 😄 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now