caso raro!

Iniciado por 0x3c, 17 Enero 2013, 13:44 PM

0 Miembros y 2 Visitantes están viendo este tema.

0x3c

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:


#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
Si Vis Pacem, Para Bellum.

Another Legend Has Fallen

-- KiLiaN --

La altura en pies también son números, prueba a declarar feet como int.
Entren al chat de elhacker.net
    
   

@kln13

0x3c

creo que para hacer eso deberia de eliminar el uso de atoi()? o no?











saludos y gracias
Si Vis Pacem, Para Bellum.

Another Legend Has Fallen

-- KiLiaN --

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.

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

int main()
{
float feet;


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


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

return(0);
}
Entren al chat de elhacker.net
    
   

@kln13

3mp3z@ndo

Creo que la función isdigit() de la libreria ctype te podría venir bien

Un saludo

Zelios Ariex

Cita de: -- 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.

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

int main()
{
float feet;


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


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

return(0);
}


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á)

0xDani

@Kilian, esta claro que no has probado a compilarlo xD. Si declaras feet como float, la sentencia:
gets(feet);

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

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

ankora45

Cita de: 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:
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
Hay dos cosas infinitas en este mundo, el universo y la estupidez humana, y de la primera no estoy muy seguro

rir3760

Cita de: 0x3c en 17 Enero 2013, 13:44 PMtodo 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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char altura[2];
   int valor;
   
   printf("Di tu altura en pies:");
   fflush(stdout);
   fgets(altura, 2, stdin);
   
   valor = atoi(altura);
   if (valor == 0)
      puts("La entrada no es valida");
   else if (valor > 5)
      puts("Eres mas alto que yo!.");
   else if (valor < 5)
      puts("Soy mas alto que tu!");
   else
      puts("Somos de la misma altura!!.");
   
   return 0;
}


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|.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

0x3c

@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
Si Vis Pacem, Para Bellum.

Another Legend Has Fallen