elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema con la sentencia if
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema con la sentencia if  (Leído 1,660 veces)
bpenword

Desconectado Desconectado

Mensajes: 4


Ver Perfil
problema con la sentencia if
« en: 12 Mayo 2019, 15:57 pm »

es un simple programa que pregunta edad y sexo, pero al ejecutarse se salta la sentencia if.
Código:
#include<stdio.h>
#include<stdlib.h>
int main(){
int edad; char sexo;

printf("ingresa tu edad:"); scanf("%d",&edad);

printf("ingresa tu sexo:F para mujer y M para hombre\n"); scanf("%c",&sexo);


if ((sexo=='F')&&(edad>23)) printf("usted es mujer y tiene más de 23 años");

if((sexo=='M')&&(edad>23)) printf("usted es hombre y tiene más de 23");

printf("usted no entra en el programa:)");

return 0;
}


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: problema con la sentencia if
« Respuesta #1 en: 12 Mayo 2019, 16:36 pm »

El problema no es que se salte la condición sino que no te deja introducir el valor de <sexo>. Esto es porque al introducir la edad, introduces un número y pulsas Enter entonces en el buffer de entrada se guarda (imaginemos que introduces 20) <20 Enter>. Luego el programa busca en el buffer de entrada el valor de edad y encuentra un 20, por lo que el programa hace <edad = 20> y en el buffer queda <Enter>. Después el programa te pregunta el sexo y como el buffer no está vacío recoge el Enter y hace <sexo = Enter> (entíendase la asigación).

Para solucionar esto debes limpiar el buffer de entrada. Normalmente te recomendarán que hagas <fflush(stdin)> para limpiarlo. Sin embargo, <fflush()> es una función que se diseñó para limpiar el buffer de salida (<fflush(stdout)>) y aunque parece que funciona para el de entrada, siempre se recomienda no usarlo ya que no está definido formalmente su comportamiento para <stdin> (en los manuales oficiales de C se expone que el comportamiento es "indeterminado")

Tienes algunas alternativas como pueden ser:
Código
  1. getchar(); // alternativa 1: coge un caracter del buffer
  2. fgetc(stdin); // alternativa 2: mas de lo mismo
  3. // Para cuando puedes tener mas de un Enter tienes una alternativa 3: en bucle

Te dejo aquí un enlace a un tema que se abrió hace un tiempo tratando de buscar alternativas a <fflush(stdin)>:
https://foro.elhacker.net/programacion_cc/iquestqueda_algo_en_el_buffer_de_entrada_stdin_solucionado-t489993.0.html
Te recomiendo que uses algunas de estas para evitar ese <fflush(stdin)> que tanto daño hace. En el fondo mejor será conocer y aplicar buenas prácticas de programación.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: problema con la sentencia if
« Respuesta #2 en: 12 Mayo 2019, 20:12 pm »

Cuidado, que en ese link dan 2 soluciones para limpiar el buffer, pero una de ellas, la que usa fseek, es casi tan mala como fflush(stdin). La verdad es que esa opción también es bastante antigua, y su problema es que parte de una premisa incorrecta: que stdin es un archivo, lo cual es falso. Lo tratamos como un archivo, pero en general, cuando nos referimos a la terminal (línea de comandos) no lo es.

La cuestión es que, en algunos sistemas stdin permite hacer búsquedas (fseek) y en otros no. Esa solución puede funcionar en Windows, igual que fflush(stdin) (aunque no hay garantía de que siempre lo haga... igual que fflush(stdin)), pero va a fallar en otros sistemas operativos, como Linux (igual que... creo que el punto está claro). De hecho, hasta hay documentación que lo dice. En Linux y algunos otros sistemas tipo Unix, la implementación de fseek llama internamente a la función del sistema lseek. La documentación oficial dice sobre esa función:

Citar
On Linux, using lseek() on a terminal device fails with the error ESPIPE.

Es decir, que usar lseek (y por lo tanto, fseek) en una terminal falla con el error ESPIPE.

Así que para limpiar el buffer lo mejor son las alternativas que te propusieron (getchar,() fgetc(stdin)), o la primera que aparece en ese link:

Código
  1. while((c = getchar()) != '\n')

Eso sí, mejor usar '\n', como te lo puse, que 0xA, que es lo que ponen en el link.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con sentencia SQL
PHP
zhynar_X 2 1,897 Último mensaje 19 Noviembre 2007, 20:13 pm
por дٳŦ٭
Sentencia Goto en Php , Salto de sentencia en Php
PHP
Graphixx 3 3,618 Último mensaje 24 Mayo 2012, 17:46 pm
por Graphixx
problema con sentencia switch
Programación C/C++
++c 2 1,914 Último mensaje 6 Mayo 2014, 00:16 am
por ++c
Problema con String y la sentencia if en c
Programación C/C++
Dark Side 2809 2 2,795 Último mensaje 15 Octubre 2020, 18:21 pm
por Dark Side 2809
problema con una sentencia nftables
GNU/Linux
schrodingersCat 0 3,930 Último mensaje 15 Octubre 2022, 18:15 pm
por schrodingersCat
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines