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

Validar un caracter en C

Estas en el tema de Validar un caracter en C en el foro de C/C++ en Foros del Web. Hola, necesito validar un solo caracter introducido por pantalla El usuario solo debe poder untroducir f o m lo hago igual que con los numero ...
  #1 (permalink)  
Antiguo 26/10/2008, 19:27
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 15 años, 6 meses
Puntos: 0
Exclamación Validar un caracter en C

Hola, necesito validar un solo caracter introducido por pantalla

El usuario solo debe poder untroducir f o m lo hago igual que con los numero pero no me funciona, aunque ponga f o m el programa no los reconoce.

Aqui esta el codigo

Código:
do
            {
            printf ("\nINTRODUZCA F PARA FEMENINO Y M PARA MASCULINO:");
               scanf ("%c", & sexo);
                  getchar();
               if ((sexo!='f')||(sexo!='m'))
               {   
                  printf("\nSEXO INCORRECTO, POR FAVOR PRESIONE ENTER E INTENTE DE NUEVO");
                     getchar();
               }
while ((sexo!='f')||(sexo!='m'));
            }
Saludos
  #2 (permalink)  
Antiguo 26/10/2008, 19:35
Avatar de punk_not_dead  
Fecha de Ingreso: octubre-2008
Ubicación: Zantiasko
Mensajes: 24
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Validar un caracter en C

char sexo; // para declararla
scanf("%s",sexo);// para leer
  #3 (permalink)  
Antiguo 26/10/2008, 20:21
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Validar un caracter en C

La varible esta declarada como char, probe:

scanf("%s", &variable);
y tambien probe
scanf("%c", &variable);

y de las dos maneras no valida la variable, siempre la toma como incorrecta.

Saludos.
  #4 (permalink)  
Antiguo 26/10/2008, 22:58
Avatar de v4mp1r0  
Fecha de Ingreso: febrero-2008
Mensajes: 36
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Validar un caracter en C

Primero, algunas aclaraciones:

punk_not_dead, le interesa leer un solo caracter, no una cadena de ellos, por lo tanto en este caso no es util el %s.

dioscw: cuando haces un %s, no debes colocar un &. Puesto que %s indica q es un puntero a un string. Por esa razon no va el &. Por lo tanto si deseas almacenar un string, basta con que hagas scanf("%s", variable);

Ahora al grano.

Tu algoritmo reconoce que el valor de sexo es f o m segun corresponda (lo probe con el gdb). Lo que tienes que hacer es cambiar el || en el if por &&, con lo que te quedaria algo como esto:
Código:
do
{
  printf ("\nIntrodusca Sexo: ");
  scanf ("%c", & sexo); getchar();     /*Con el getchar rescatas el enter*/
  if (sexo!='f'&&sexo!='m')               
    printf("\nSEXO INCORRECTO, POR FAVOR PRESIONE ENTER E INTENTE DE NUEVO");
}        
while (sexo!='f' && sexo!='m');
Recuerda que un || para que sea falso, ambos valores deben ser falsos, en cambio con el &&, basta que uno lo sea.

Salu2!
  #5 (permalink)  
Antiguo 27/10/2008, 11:40
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Validar un caracter en C

Gracias ya ahora viendolo me di cuenta que como lo escribi con que una condicion no se cumpliera reiniciaba el ciclo.

Ahora tengo otra duda, el programa debe correr varias veces si el usuario asi lo quiere y corre perfecto la primera vez pero si se intoduce algun valor fuera de rango como por ejemplo si te equivocas y colocas 'd' en vez de 'f' despues ya no lo valida ni que el nuevo valor este en el rango permitido.

¿Que puede ser?

aqui el codigo completo
Código:
#include <stdlib.h>
#include <stdio.h>
#include <conio.c>
#include <time.h>


char sexo; //variable alfabetica usada para almacenar el sexo del usuario
int edad=0, apuesta=0, n1=0, n2=0, n3=0;//variables introducidas por el usuario
//variables usadas como contadores y para almacenar resultados de las operaciones matematicas
int cm=0, cf=0, ganancia=0, resp=0, perd=0, g1=0, g2=0, g3=0;
int d1=0, d2=0, d3=0; //variable que almacena los lanzamientos aleatorios del dado

//lee informacion introducida por el ususario
void leerInformacion()
{
   while (resp==0)
   {        do// verifica el sexo introducido por la persona
            {
            printf ("\nINTRODUZCA F PARA FEMENINO Y M PARA MASCULINO:");
               scanf ("%c", & sexo);
                  getchar();
               if ((sexo!='f')&&(sexo!='m'))
               {   
                  clrscr();
                  printf("\nSEXO INCORRECTO INTENTE DE NUEVO\n");
               }//cierra if de sexo
            }//cierra do de sexo
            while((sexo!='f')&&(sexo!='m'));
            
            if (sexo=='m')
            {
               cm=cm+1;//almacena una unidad en el contador de hombres
            }
            else if (sexo=='f')
            {
               cf=cf+1;//almacena una unidad en el contador de mujeres
            }
             
            do//Verifica que la edad este dentro del rango permitido
            {
               printf ("\nINTRODUZCA SU EDAD:");
                  scanf("%d", &edad); 
                     getchar(); 
                     if ((edad<18)||(edad>100))
                     {
                        printf ("\nEDAD PERMITIDA ENTRE 18 Y 100 \nPRESIONE ENTER E INTENTE DE NUEVO:");
                           getchar();  
                     }
             }
             while((edad<18)||(edad>100));    
    
             printf ("\nINTRODUZCA EL MONTO QUE DESEA APOSTAR:");//Pide el monto a apostar
                scanf("%d", &apuesta);//almacena el monto a apostar en la variable "apuesta"       
    
             do
             {
                printf("\nINTRODUZCA UN DIGITO DEL 1 AL 6:");
                   scanf("%d", &n1); 
                      getchar(); 
                      if ((n1<1)||(n1>6))
                      {
                         printf ("USTED DEBE INTRODUCIR UN NUMERO ENTRE 1 Y 6");
                            getchar();  
                      }
             }    
             while ((n1<1)||(n1>6));
             
             do
             {
                printf("\nINTRODUZCA UN SEGUNDO DIGITO DEL 1 AL 6:");
                   scanf("%d", &n2);
                      getchar(); 
                      if ((n2<1)||(n2>6))
                      {
                         printf ("USTED DEBE INTRODUCIR UN NUMERO ENTRE 1 Y 6");
                            getchar();  
                      } 
             }                         
             while ((n2<1)||(n2>6));
    
             do
             {
                printf("\nINTRODUZCA UN TERCER DIGITO DEL 1 AL 6:");
                   scanf ("%d", &n3);
                      getchar(); 
                      if ((n3<1)||(n3>6))
                      {
                         printf ("\nUSTED DEBE INTRODUCIR UN NUMERO ENTRE 1 Y 6");
                         getchar();  
                      }
             }
             while ((n3<1)||(n3>6));
	
             srand(time(NULL)); //llama al reloj del PC y utiliza los segundos para el generador de numeros aleatorios "sacado de Deitel"
                d1=1+(rand()%6);//genera un numero aleatorio entre el 1 y el 6
                   d2=1+(rand()%6);//genera un numero aleatorio entre el 1 y el 6
                      d3=1+(rand()%6);//genera un numero aleatorio entre el 1 y el 6
            
// CALCULA LAS GANANCIAS EN BASE A LA CANTIDAD DE NUMEROS ACERTADOS POR EL USUSARIO            
             if ((n1!=d1)&&(n1!=d2)&&(n1!=d3)&&(n2!=d1)&&(n2!=d2)&&(n2!=d3)&&(n3!=d1)&&(n3!=d2)&&(n3!=d3)) //NO ADIVINA NINGUN NUMERO pierde el triple de apuesta
             {
                ganancia=-(apuesta*3);
                   perd=perd+1;//almacena una unidad en el contador de juegos perdidos
             }
             else if ((n1==d1)||(n1==d2)||(n1==d3)||(n2==d1)||(n2==d2)||(n2==d3)||(n3==d1)||(n3==d2)||(n3==d3))//ADIVINA UN SOLO NUMERO  gana el monto apostado
             {
                ganancia=apuesta;
                   g1=g1+1;//almacena una unidad en el contador de un solo numeero adivinados
             }
             else  if (((n1==d1)||(n1==d2)||(n1!=d3))||((n1==d1)||(n1!=d2)||(n1!=d3))||((n1!=d1)||(n1==d2)||(n1!=d3)))//ADVIVINA DOS NUMEROS gana el doble de lo apostado
             {
                ganancia=(apuesta*2);
                   g2=g2+1;//almacena una unidad en el contador de dos numeros adivinados
             }
             else if (((n1==d1)||(n1==d2)||(n1==d3))&&((n2==d1)||(n2==d2)||(n2==d3))&&((n3==d1)||(n3==d2)||(n3==d3)))//ADIVINA TODOS LOS NUMEROS gana el triple de los apostado
             {
                ganancia=(apuesta*3);
                   g3=g3+1; //almacena una unidad en el contador de tres numeros adivinados
             }
    
             printf("%s %d","\nEL PRIMER VALOR ES:", d1);
                printf("%s %d","\n\nEL SEGUNDO VALOR ES:", d2);
                   printf("%s %d","\n\nEL TERCER VALOR ES:", d3);
                      printf("%s %d", "\n\nSU GANANCIA ES:",ganancia);
                         getchar();
                            printf("\nPRESIONE CERO PARA JUGAR NUEVAMENTE:");
                               scanf("%d", &resp);
    
   }//cierra el while
}// cierra el void

void mostrarResultado()
{
    printf("%s %d", "VECES QUE SE GANO EL MONTO APOSTADO:", g1);
       printf("%s %d", "\nVECES QUE SE GANO EL DOBLE DEL MONTO APOSTADO:", g2);
          printf("%s %d", "\nVECES QUE SE GANO EL TRIPLE DEL MONTO APOSTADO:", g3);
             printf("%s %d", "\nVECES QUE SE PERDIO:", perd); 
                getchar();
    if (cf>cm)
    {
       printf ("\nLAS MUJERES HAN JUGADO MAS VECES QUE LOS HOMBRES");
          getchar();
    }
    else if (cf<cm)
    {
       printf ("\nLOS HOMBRES HAN JUGADO MAS VECES QUE LAS MUJERES");
          getchar();
    }
}
//programa principal
main()
{
   leerInformacion();
   mostrarResultado();
   getchar();
}
Saludos
  #6 (permalink)  
Antiguo 27/10/2008, 20:17
Avatar de v4mp1r0  
Fecha de Ingreso: febrero-2008
Mensajes: 36
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Validar un caracter en C

En el main puedes hacer lo siguiente:
Código:
int main(){
  char opc;
  do
  {
    leerInformacion();
    mostrarResultado();
    printf("Desea continuar?(S)i - (N)o: ");
    scanf("%c", &opc);getchar();
  }
  while(opc!='n' || opc!='N');
  return 0;
}
Como consejo, no dejes todas las variables como globales, aprende sobre los pasos por parametros, es mas util que usar todo como variables globales.

Con respecto a lo otro, no entendi bien tu duda, si pudieras ser mas claro, te podria ayudar con gusto.

Salu2!
  #7 (permalink)  
Antiguo 29/10/2008, 17:31
 
Fecha de Ingreso: septiembre-2008
Mensajes: 22
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Validar un caracter en C

Bueno ojala no sea tarde para poder ayudarte pero tambien podrias usar el getch
para tomar el valor ascii te mando una pequeña estructura pra que te formes una idea xde lo que te hablo...

#include<stdio.h>
#include<conio.h>

main()

{

int caracter;//a pesar de que es un entero, puede almacenar
//con toda facilidad un caracter, ya que un caracter
//mide la mitad que el entero

printf("\n presione una tecla: "),

caracter = getch();//toma un caracter del teclado y lo mete en la variable.

if(caracter==32)
{

printf("paso el if con caracter =%d", caracter);
}
else
printf("no paso \n");
{

getch();//espera a que teclee un caracter del teclado, con esto hacemos que se pare la pantalla
}
return 0;
}

saludos cordiales...
  #8 (permalink)  
Antiguo 31/10/2008, 21:01
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Validar un caracter en C

Estoy viendo el primer curso de programación en la universidad es programación en C para Ingenieria de Sistemas, tengo que declarar las variables como globales por ahora, y no puedo usar el getch porque no lo han dado.

El problema con mi programa es que despues de la primera corrida no quiere validar el sexo aunque sea correcto.

Ya lo e cambiado un poco y lo pongo de nuevo:
Código:
#include <stdio.h>
#include <stdio.h>
#include <conio.c>
#include <time.h>

char  opc;
int edad=0, apuesta=0, n1=0, n2=0, n3=0;//variables introducidas por el usuario
//variables usadas como contadores y para almacenar resultados de las operaciones matematicas
int cm=0, cf=0, ganancia=0, perd=0, g1=0, g2=0, g3=0;
int d1=0, d2=0, d3=0; //variable que almacena los lanzamientos aleatorios del dado

void leerInformacion()
{
do
{
            char sexo;
            do// verifica el sexo introducido por la persona
            {
                printf ("\nINTRODUZCA F PARA FEMENINO Y M PARA MASCULINO:");
                   scanf ("%c", & sexo);
                      getchar();
               if ((sexo!='f')&&(sexo!='m'))
               {   
                  printf("\nSEXO INCORRECTO INTENTE DE NUEVO\n");
               }//cierra if de sexo
            }//cierra do de sexo
            while((sexo!='f')&&(sexo!='m'));
            
            if (sexo=='m')
            {
               cm=cm+1;//almacena una unidad en el contador de hombres
            }
            else if (sexo=='f')
            {
               cf=cf+1;//almacena una unidad en el contador de mujeres
            }
             
            do//Verifica que la edad este dentro del rango permitido
            {
               printf ("\nINTRODUZCA SU EDAD:");
                  scanf("%d", &edad); 
                     getchar(); 
                     if ((edad<18)||(edad>100))
                     {
                        printf ("\nEDAD PERMITIDA ENTRE 18 Y 100 \nPRESIONE ENTER E INTENTE DE NUEVO:");
                           getchar();  
                     }
             }
             while((edad<18)||(edad>100));    
    
             printf ("\nINTRODUZCA EL MONTO QUE DESEA APOSTAR:");//Pide el monto a apostar
                scanf("%d", &apuesta);//almacena el monto a apostar en la variable "apuesta"       
    
             do
             {
                printf("\nINTRODUZCA UN DIGITO DEL 1 AL 6:");
                   scanf("%d", &n1); 
                      getchar(); 
                      if ((n1<1)||(n1>6))
                      {
                         printf ("USTED DEBE INTRODUCIR UN NUMERO ENTRE 1 Y 6");
                            getchar();  
                      }
             }    
             while ((n1<1)||(n1>6));
             
             do
             {
                printf("\nINTRODUZCA UN SEGUNDO DIGITO DEL 1 AL 6:");
                   scanf("%d", &n2);
                      getchar(); 
                      if ((n2<1)||(n2>6))
                      {
                         printf ("USTED DEBE INTRODUCIR UN NUMERO ENTRE 1 Y 6");
                            getchar();  
                      } 
             }                         
             while ((n2<1)||(n2>6));
    
             do
             {
                printf("\nINTRODUZCA UN TERCER DIGITO DEL 1 AL 6:");
                   scanf ("%d", &n3);
                      getchar(); 
                      if ((n3<1)||(n3>6))
                      {
                         printf ("\nUSTED DEBE INTRODUCIR UN NUMERO ENTRE 1 Y 6");
                         getchar();  
                      }
             }
             while ((n3<1)||(n3>6));
	
             srand(time(NULL)); //llama al reloj del PC y utiliza los segundos para el generador de numeros aleatorios "sacado de Deitel"
                d1=1+(rand()%6);//genera un numero aleatorio entre el 1 y el 6
                   d2=1+(rand()%6);//genera un numero aleatorio entre el 1 y el 6
                      d3=1+(rand()%6);//genera un numero aleatorio entre el 1 y el 6
            
// CALCULA LAS GANANCIAS EN BASE A LA CANTIDAD DE NUMEROS ACERTADOS POR EL USUSARIO            
             if ((n1!=d1)&&(n1!=d2)&&(n1!=d3)&&(n2!=d1)&&(n2!=d2)&&(n2!=d3)&&(n3!=d1)&&(n3!=d2)&&(n3!=d3)) //NO ADIVINA NINGUN NUMERO pierde el triple de apuesta
             {
                ganancia=-(apuesta*3);
                   perd=perd+1;//almacena una unidad en el contador de juegos perdidos
             }
             else if ((n1==d1)||(n1==d2)||(n1==d3)||(n2==d1)||(n2==d2)||(n2==d3)||(n3==d1)||(n3==d2)||(n3==d3))//ADIVINA UN SOLO NUMERO  gana el monto apostado
             {
                ganancia=apuesta;
                   g1=g1+1;//almacena una unidad en el contador de un solo numeero adivinados
             }
             else  if (((n1==d1)||(n1==d2)||(n1!=d3))||((n1==d1)||(n1!=d2)||(n1!=d3))||((n1!=d1)||(n1==d2)||(n1!=d3)))//ADVIVINA DOS NUMEROS gana el doble de lo apostado
             {
                ganancia=(apuesta*2);
                   g2=g2+1;//almacena una unidad en el contador de dos numeros adivinados
             }
             else if (((n1==d1)||(n1==d2)||(n1==d3))&&((n2==d1)||(n2==d2)||(n2==d3))&&((n3==d1)||(n3==d2)||(n3==d3)))//ADIVINA TODOS LOS NUMEROS gana el triple de los apostado
             {
                ganancia=(apuesta*3);
                   g3=g3+1; //almacena una unidad en el contador de tres numeros adivinados
             }
    
             printf("%s %d","\nEL PRIMER VALOR ES:", d1);
                printf("%s %d","\n\nEL SEGUNDO VALOR ES:", d2);
                   printf("%s %d","\n\nEL TERCER VALOR ES:", d3);
                      printf("%s %d", "\n\nSU GANANCIA ES:",ganancia);
                         printf("\n\nDESEA CONTINUAR?(S)I - (N)O: ");
                             scanf("%c", &opc);
                         
    }
    
    while ((opc=='s') || (opc=='S'));
}// cierra el void

void mostrarResultado()
{
    
       printf("%s %d", "\nVECES QUE SE GANO EL MONTO APOSTADO:", g1);
          printf("%s %d", "\n\nVECES QUE SE GANO EL DOBLE DEL MONTO APOSTADO:", g2);
             printf("%s %d", "\n\nVECES QUE SE GANO EL TRIPLE DEL MONTO APOSTADO:", g3);
                printf("%s %d", "\n\nVECES QUE SE PERDIO:", perd); 
                   getchar();
    if (cf>cm)
    {
       printf ("\n\nLAS MUJERES HAN JUGADO MAS VECES QUE LOS HOMBRES");
          getchar();
    }
    else if (cf<cm)
    {
       printf ("\n\nLOS HOMBRES HAN JUGADO MAS VECES QUE LAS MUJERES");
          getchar();
    }
}


main()
{
    leerInformacion();
    mostrarResultado();
    getchar();
    
}

Saludos.

Última edición por dioscw; 31/10/2008 a las 21:27
  #9 (permalink)  
Antiguo 31/10/2008, 21:04
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Validar un caracter en C

Cita:
Iniciado por v4mp1r0 Ver Mensaje
En el main puedes hacer lo siguiente:
Código:
int main(){
  char opc;
  do
  {
    leerInformacion();
    mostrarResultado();
    printf("Desea continuar?(S)i - (N)o: ");
    scanf("%c", &opc);getchar();
  }
  while(opc!='n' || opc!='N');
  return 0;
}
Esto si lo puedo usar e intentare a ver que tal me va con eso.
Gracias por tu ayuda.
Saludos.
  #10 (permalink)  
Antiguo 05/11/2008, 10:19
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Validar un caracter en C

Gracias a todos por su ayuda ya el programa corre bien.

Saludos.
  #11 (permalink)  
Antiguo 18/03/2015, 19:06
 
Fecha de Ingreso: marzo-2015
Ubicación: BOGOTA
Mensajes: 1
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Validar un caracter en C

Cita:
Iniciado por dioscw Ver Mensaje
Hola, necesito validar un solo caracter introducido por pantalla

El usuario solo debe poder untroducir f o m lo hago igual que con los numero pero no me funciona, aunque ponga f o m el programa no los reconoce.

Aqui esta el codigo

Código:
do
            {
            printf ("\nINTRODUZCA F PARA FEMENINO Y M PARA MASCULINO:");
               scanf ("%c", & sexo);
                  getchar();
               if ((sexo!='f')||(sexo!='m'))
               {   
                  printf("\nSEXO INCORRECTO, POR FAVOR PRESIONE ENTER E INTENTE DE NUEVO");
                     getchar();
               }
while ((sexo!='f')||(sexo!='m'));
            }
Saludos
pregunta si el usuario ingresa femenino como condiciono para que solo pueda escribir en pantalla solo la f que no le permita escribir mas
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:49.