Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Nmaster

Questão acerca do codigo

Mensagens Recomendadas

Nmaster

Boas pessoal. Ando aqui no estudo(inicial) do C, a tentar ganhar o maximo de conhecimento que puder. Gostava que me dissessem como posso prevenir que ao correr o programa, e depois ao inserir no input letras ou caracteres que o programa fique "marado".

Sera isso possivel atravez de por exemplo o assert? há outras formas também?se sim quais?

Estou a tentar fazer isso para o seguinte codigo:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

float celsius_from_fahr(void)
{
    float f,c;
    printf("Diga a temperatura em Fahreneit ao qual pretende saber a sua correspondencia em Celsius:");
    scanf("%f",&f);
    c = (f-32)/1.8;
    printf("Para %.2f fahreneit temos %.2f Celsius\n",f,c);
    return c;
}

float fahr_from_Celsius(void)
{
    float f,c;
    printf("Diga a temperatura em Celsius ao qual pretende saber a sua correspondencia em Fahreneit:");
    scanf("%f",&c);
    f = (c*1.8)+32;
    printf("Para %.2f Celsius temos %.2f fahreneit\n",c,f);
    return c;
}
   
int main (void)//o main não tem argumentos de entrada (logo tem como arg "void") mas da yn return de um inteiro (logo é do tipo int)
{
    int i;
   do{
      printf("Qual das seguintes conversoes de temperatura, pretende o usuario saber?\n1-Conversao Celsius -> Fahreneit\n2-Conversao Fahreneit -> Celsius\n0-Para sair\n");
      scanf("%d",&i);
                  switch (i)
            {
            case 0:
                 return 0;
            case 1:
                 fahr_from_Celsius();
                 break;
            case 2:
                 celsius_from_fahr();
                 break;
            default:
                 printf("Ups, nao existe essa opcao.\n");
                 break;
    }
}
while(i!=NULL);
      
    system("PAUSE");
    return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
IRX773

Eu não sou muito a favor do assert devido à memoria que este gasta a mais .... principalmente se forem vários.

Mas acho que para o caso um assert faria a diferença.

Ou então ao pedir ao utilizador os graus pedias em formato string e depois convertias para int ou float antes de fazeres os cálculos ... isso resolvia o problema do programa ficar marado.

float celsius_from_fahr(void)
{
    float f,c;
    char string [99];
    printf("Diga a temperatura em Fahreneit ao qual pretende saber a sua correspondencia em Celsius:");
    gets(string);
    f = atof (string);
    c = (f-32)/1.8;
    printf("Para %.2f fahreneit temos %.2f Celsius\n",f,c);
    return c;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Não uses o gets para leres strings, corres o risco de ter bufferoverflow's e do programa ficar "marado" na mesma.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
IRX773

Não uses o gets para leres strings, corres o risco de ter bufferoverflow's e do programa ficar "marado" na mesma.

Sim ... usa o fgets .. .mas para a string .... Sorry ... esqueci-me do bufferoverflow.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nmaster

Ja fiz uma alterações, agora tenho o codigo assim:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
//#include <string.h>

float celsius_from_fahr(void)
{
    float f,c;
    char string [99];
    printf("Diga a temperatura em Fahreneit ao qual pretende saber a sua correspondencia em Celsius:\n");
    fflush(stdin);
    gets(string);
    f=atof(string);
    //scanf("%f",&f);
    c = (f-32)/1.8;
    printf("Para %.2f fahreneit temos %.2f Celsius\n",f,c);
    return c;
}

float fahr_from_Celsius(void)
{
    float f,c;
    char string [99];
    printf("Diga a temperatura em Celsius ao qual pretende saber a sua correspondencia em Fahreneit:\n");
    fflush(stdin);
    gets(string);
    c=atof(string);
    //scanf("%f",&c);
    f = (c*1.8)+32;
    printf("Para %.2f Celsius temos %.2f fahreneit\n",c,f);
    return c;
}
   
int main (void)//o main não tem argumentos de entrada (logo tem como arg "void") mas da um return de um inteiro (logo é do tipo int)
{
char temp[100];
int i;
   do{
      printf("Qual das seguintes conversoes de temperatura, pretende o usuario saber?\n1-Conversao Celsius -> Fahreneit\n2-Conversao Fahreneit -> Celsius\n0-Para sair\n");
      scanf("%d",&i);
                  switch (i)
            {
            case 0:
                 return 0;
            case 1:
                 fahr_from_Celsius();
                 break;
            case 2:
                 celsius_from_fahr();
                 break;
            default:
                 printf("Ups, nao existe essa opcao.\n");
                 break;
    }
    printf("\nDeseja continuar? (S/N): ");
    fflush(stdin);
    gets(temp);
}
while(toupper(*temp)=='S');
      
    system("PAUSE");
    return 0;
}

Agora mesmo que ponha no input letras ou caracteres a variavel toma o valor de 'zero'.

Sabem de mais alguma coisa que possa fazer para melhorar? em que contexto usariam aqui o assert?

Obrigado pelas sugestões pessoal. :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Usa a função atoi.

Deixo-te aqui um exemplo do seu uso:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int iNum = 0;
  char SzStr[10];
  fgets(SzStr,9,stdin);
  iNum = atoi(SzStr);
  printf("%i\n", iNum-1);
  return 0;
}

A função atoi se receber uma string que contenha letras retorna 0, se receber números retorna esses mesmos números.

Por isso tens de ter em atenção de que se forem letras estarás a lidar com o número 0.

p.s. Não uses a função gets como já foi dito anteriormente.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

A função atoi se receber uma string que contenha letras retorna 0, se receber números retorna esses mesmos números.

Por isso tens de ter em atenção de que se forem letras estarás a lidar com o número 0.

É quase isso. Após eliminar os caracteres brancos iniciais, procura por um sinal de + ou - opcional, e de seguida começa a percorrer o que resta da string. Enquanto os caracteres encontrados corresponderem a dígitos, então ela vai fazendo a conversão. Mal encontre algo que não seja dígito  então pára. Ou seja, atoi("123asd") = 123. Mas caso encontre logo de início um caracter não dígito, então devolve 0, ou seja, atoi("asd123") = 0.

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.