Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error en IF para validad sexo (M/F)

Estas en el tema de Error en IF para validad sexo (M/F) en el foro de C/C++ en Foros del Web. Código: printf("\tSexo (M/F): "); scanf("%s", lcsexo); if ((lcsexo != 'M') || (lcsexo != 'F')) { printf("\tERROR!... Debe ingresar M %c F.\n", 162); return 0; } ...
  #1 (permalink)  
Antiguo 21/01/2015, 12:33
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 13 años, 8 meses
Puntos: 5
Error en IF para validad sexo (M/F)

Código:
printf("\tSexo (M/F): ");
    scanf("%s", lcsexo);
    if ((lcsexo != 'M') || (lcsexo != 'F'))
    {
        printf("\tERROR!... Debe ingresar M %c F.\n", 162);
        return 0;
    }
No me funciona esa validacion, ingrese lo que ingrese me sale error. Que hago mal?
Estoy aprendiendo a programar en C en la universidad.

Quiero decir en el programa que: si no es M O F, salga el mensaje de error y el programa se detenga.
  #2 (permalink)  
Antiguo 21/01/2015, 13:17
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 7 años, 10 meses
Puntos: 204
Respuesta: Error en IF para validad sexo (M/F)

Lo primero, la comparación if ( X != 0 || X != 1 ) va a ser válida SIEMPRE, ya que X no puede ser 1 y 0 a la vez... ese "or" tiene que ser un "and".

Lo segundo, el %s del scanf indica que va a almacenar en lcsexo un string en vez de un char... que no es lo mismo. Entonces pueden pasar dos cosas:

* lcsexo es de tipo char*: dado que entonces lcsexo es un puntero, la comparación lcsexo != 'M' está comparando una dirección de memoria con el carácter 'M'... que obviamente no van a coincidir.

* lcsexo es de tipo char: entonces, dado que scanf esperaba recibir un puntero, el programa te está escribiendo lo introducido por el teclado en dios sabe donde y, por tanto, la comparación va a ser también errónea.

Yo imagino que te estará pasando lo primero, en ese caso tienes tres posibles opciones:

1. cambia la declaración de lcsexo para que sea, simplemente, char, después cambia el scanf por esto: scanf( "%c", &lcsexo ) y listo.

2. Dado que lcsexo es un puntero, tienes que usar lógica de punteros para hacer las comparaciones: if ( *lcsexo != 'M' && *lcsexo != 'F' )

3. Usa las funciones de la biblioteca estándar para comparar cadenas: if ( strcmp( lcsexo, "M" ) != 0 && strcmp( lcsexo, "F" ) != 0 )

Cualquiera de las tres opciones te resuelve el problema. Eso sí, tienes que tener en cuenta que únicamente van a funcionar con mayúsuculas y, además, la segunda opción tiene el problema de que si introduces más de un carácter puede tomar la solución como buena, por ejemplo "Mas", ya que empieza por 'M'.

Un saludo.

Etiquetas: funcion, programa, sexo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:28.