Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 0x3c en 17 Enero 2013, 13:44 pm



Título: caso raro!
Publicado por: 0x3c en 17 Enero 2013, 13:44 pm
practicando los ejemplos del libro de C que estoy leyendo pude crear un programa que lo unico que hace es comparar la altura del usuario con la mia(suena bastante estupido lo se) todo funciona bien el programa compila y se ejecuta a la perfeccion :D...sin embargo deberia fallar cuando en vez de recibir un numero recibe una letra cosa que no pasa, habra algun error??

E.P.:se me olvido preguntar si quiero que el programa muestre un error cuando el input es una latra y no un numero como lo puedo hacer?? por ejemplo lo ejecute y le puse 'h' en vez de de un numero del 1 al 9 y el mensaje que recibi fue:

Soy mayor que tu

este es el codigo:

Código:
#include <stdio.h>
#include <stdlib.h>

int main()
{
char feet[2];
int msr;

printf("Di tu altura en pies:");
gets(feet);
msr=atoi(feet);

if(msr>5) printf("Eres mas alto que yo!.\n");
if(msr<5) printf("Soy mas alto que tu!\n");
if(msr==5) printf("Somos de la misma altura!!.\n");

return(0);
}

saludos


Título: Re: caso raro!
Publicado por: -- KiLiaN -- en 17 Enero 2013, 13:51 pm
La altura en pies también son números, prueba a declarar feet como int.


Título: Re: caso raro!
Publicado por: 0x3c en 17 Enero 2013, 13:57 pm
creo que para hacer eso deberia de eliminar el uso de atoi()? o no?











saludos y gracias


Título: Re: caso raro!
Publicado por: -- KiLiaN -- en 17 Enero 2013, 14:07 pm
La verdad no se que hace atoi() xD pero yo creo que te lo puedes quitar, si la variable feet va a recibir valores con décimales declaralá con float.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. float feet;
  7.  
  8.  
  9. printf("Di tu altura en pies:");
  10. gets(feet);
  11.  
  12.  
  13. if(feet>5) printf("Eres mas alto que yo!.\n");
  14. if(feet<5) printf("Soy mas alto que tu!\n");
  15. if(feet==5) printf("Somos de la misma altura!!.\n");
  16.  
  17. return(0);
  18. }


Título: Re: caso raro!
Publicado por: 3mp3z@ndo en 17 Enero 2013, 15:07 pm
Creo que la función isdigit() de la libreria ctype te podría venir bien

Un saludo


Título: Re: caso raro!
Publicado por: Zelios Ariex en 17 Enero 2013, 15:45 pm
La verdad no se que hace atoi() xD pero yo creo que te lo puedes quitar, si la variable feet va a recibir valores con décimales declaralá con float.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. float feet;
  7.  
  8.  
  9. printf("Di tu altura en pies:");
  10. gets(feet);
  11.  
  12.  
  13. if(feet>5) printf("Eres mas alto que yo!.\n");
  14. if(feet<5) printf("Soy mas alto que tu!\n");
  15. if(feet==5) printf("Somos de la misma altura!!.\n");
  16.  
  17. return(0);
  18. }

Lo que hace la función atoi(), es hacer una conversion de string a int, por ejemplo si metes un string que sea: "42" te lo convierte a un int de 42 (almacenandolo en otra variable, claro está)


Título: Re: caso raro!
Publicado por: 0xDani en 17 Enero 2013, 15:52 pm
@Kilian, esta claro que no has probado a compilarlo xD. Si declaras feet como float, la sentencia:
Código
  1. gets(feet);

Te lanzara un error de compilacion, porque gets() espera un puntero a char.

Saludos.


Título: Re: caso raro!
Publicado por: ankora45 en 17 Enero 2013, 16:33 pm
@Kilian, esta claro que no has probado a compilarlo xD. Si declaras feet como float, la sentencia:
Código
  1. gets(feet);

Te lanzara un error de compilacion, porque gets() espera un puntero a char.

Saludos.

creo que se puede convertir la variable feet a un string y leerlo con fgets() pero si solo quieres un programa sencillo no te compliques la vida xD


Título: Re: caso raro!
Publicado por: rir3760 en 17 Enero 2013, 16:37 pm
todo funciona bien el programa compila y se ejecuta a la perfeccion :D...sin embargo deberia fallar cuando en vez de recibir un numero recibe una letra cosa que no pasa, habra algun error?
El problema se debe a que no verificas el valor de retorno de la función "atoi". Cuando esta función no puede obtener un valor entero en base a la cadena pasada como argumento su valor de retorno es cero. Un detalle: también retorna ese valor si la entrada es "0", una de las razones por las cuales se desaconseja su uso en favor de strtol.

Lo que debes hacer es verificar el mentado valor y si es cero indicar que la entrada no es valida, caso contrario realizas la operación:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char altura[2];
  7.   int valor;
  8.  
  9.   printf("Di tu altura en pies:");
  10.   fflush(stdout);
  11.   fgets(altura, 2, stdin);
  12.  
  13.   valor = atoi(altura);
  14.   if (valor == 0)
  15.      puts("La entrada no es valida");
  16.   else if (valor > 5)
  17.      puts("Eres mas alto que yo!.");
  18.   else if (valor < 5)
  19.      puts("Soy mas alto que tu!");
  20.   else
  21.      puts("Somos de la misma altura!!.");
  22.  
  23.   return 0;
  24. }

También se debe evitar el uso de gets, en su lugar puedes utilizar fgets. Y por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Un saludo


Título: Re: caso raro!
Publicado por: 0x3c en 17 Enero 2013, 17:51 pm
@rir3760
soy novato en esto de la programacion...en el libro que estoy leyendo dice que gets() y atoi() son funciones inseguras y que no deberian usarse, al menos no en pogramas serios..gracias por la recomendacion :D

tendre que darle una leida al link que pusiste

@todos
gracias por sus sugerencias ademas debo decirles que siempre se me olvida decir que estoy programando bajo GNU/Linux no bajo Windows




saludos


Título: Re: caso raro!
Publicado por: 0xDani en 17 Enero 2013, 19:41 pm
@todos
gracias por sus sugerencias ademas debo decirles que siempre se me olvida decir que estoy programando bajo GNU/Linux no bajo Windows

Pues ya te he fichado xD, procurare responderte.

Saludos.


Título: Re: caso raro!
Publicado por: -- KiLiaN -- en 17 Enero 2013, 19:56 pm
Citar
@Kilian, esta claro que no has probado a compilarlo xD
Sinceramente, no xD perdón 0x3c si te he confundido más, lo hice de pasada y sin pararme como debería ser. Yo también estoy empezando con c (c++) y debería haberme quedado calladito xD

Citar
Pues ya te he fichado xD, procurare responderte.

No es el único que usa Gnu/linux.. :silbar: xDD aunque también (y principalmente) uso win..


Título: Re: caso raro!
Publicado por: 0xDani en 18 Enero 2013, 15:56 pm
Sinceramente, no xD perdón 0x3c si te he confundido más, lo hice de pasada y sin pararme como debería ser. Yo también estoy empezando con c (c++) y debería haberme quedado calladito xD

Si estas aprendiendo C++ y estas acostumbrado a cin y cout entonces es normal que se te haya pasado, porque estos tienen operadores defindos para casi todos los tipos de datos estandar.

No es el único que usa Gnu/linux.. :silbar: xDD aunque también (y principalmente) uso win..

Pues entonces como el que tiene un tio en Graná...  :silbar: