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

Comparaciones tipo char

Estas en el tema de Comparaciones tipo char en el foro de C/C++ en Foros del Web. Hola a todos! Estoy teniendo algunas dificultades a la hora de realizar unas comparaciones con variables de tipo char. Resulta que tengo una variable declarada ...
  #1 (permalink)  
Antiguo 08/12/2009, 11:54
Avatar de calathea  
Fecha de Ingreso: octubre-2008
Ubicación: Valladolid
Mensajes: 122
Antigüedad: 15 años, 6 meses
Puntos: 3
Comparaciones tipo char

Hola a todos!

Estoy teniendo algunas dificultades a la hora de realizar unas comparaciones con variables de tipo char.

Resulta que tengo una variable declarada de la siguiente forma:

char entrada[100];

En esta variable voy a almacenar unos datos recogidos por teclado. En principio yo no se qué voy a recoger, si un solo caracter, una cadena de caracteres, un número...Esto podría hacerlo declarando varias variables y almacenandolo en variables distintas después de comprobar el tipo de datos que voy a introducir...pero creo que el código me quedaría peor y mas extenso

Me explico: Esta variable la utilizo en un TAD en el que almaceno los datos de una pregunta: ID, texto, tipo de datos de un personaje a los que afecta y respuesta esperada.

Si el tipo de datos a los que afecta es al sexo del personaje, entonces la respuesta esperada será un caracter, igual que si afecta al estado civil; si afecta a la nacionalidad, será una cadena de caracteres...etc

Por esto, la respusta esperada la almaceno en entrada y luego hago las comparaciones pertinentes para ver si es una respuesta válida. El problema viene aqui:

Si, por ejemplo, estoy con una pregunta que afecte al sexo, al comparar la entrada con los caracteres "f", "F", "m" y "M" no me realiza bien la comparación.
¿Alguien podría decirme cómo hacerlo? Gracias d antemano. Os pongo el código que tengo:

Código c:
Ver original
  1. printf("\n\tRespuesta esperada <pulse RETURN para ver la ayuda>: ");
  2.     fflush(stdin);
  3.     gets(entrada);
  4.  
  5.     if(entrada[0]==0)
  6.     {
  7.         printf("\n");
  8.         respuesta();  //función que abre un archivo de texto con la ayuda
  9.         printf("\nEscriba la respuesta esperada: ");
  10.         gets(entrada);
  11.     }
  12.  
  13.         strcpy(pregunta->respuesta, entrada);
  14.  
  15.         if(pregunta->afecta == 2) //el codigo 2 es el del sexo
  16.         {
  17.             do
  18.             {
  19.                 if(entrada == 'f' || entrada == 'F')
  20.                 {
  21.                     strcpy(pregunta->respuesta, (char)12);  //simbolo sexo femenino
  22.                     cont++;
  23.                 }  //a pesar de que en el debugger se ve que entrada adopta el valor 'f' (por ej), no entra en el if
  24.                 if(entrada == 'm' || entrada == 'M')
  25.                 {
  26.                     strcpy(pregunta->respuesta, (char)11);  //símbolo sexo masculino
  27.                     cont++;
  28.                 }
  29.                 //si no se ha seleccionada F, f, M o m
  30.                 if(cont == 0) //al no entrar en los if, el contador no aumenta y entramos aqui: respuesta esperada erronea...
  31.                 {
  32.                     printf("\nLa respuesta esperada es erronea, introduzcala de nuevo: ");
  33.                     gets(entrada);
  34.                     fflush(stdin);
  35.                 }
  36.             }while(cont==0);
  37.         }

Con strcmp también me da error

Última edición por calathea; 08/12/2009 a las 12:00 Razón: me sobraba un else en el codigo...
  #2 (permalink)  
Antiguo 09/12/2009, 10:40
 
Fecha de Ingreso: diciembre-2009
Mensajes: 5
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Comparaciones tipo char

aver te explico hasta donde yo se, si tu haces un array de char y lees con un gets C lo trata como una "cadena de texto" y por tanto si introduces hola el guarda cada letra en un indice y al final siempre mete un '\0' que para el significa fin de cadena.

para comparar cadenas se utiliza strcmp(cadena1,cadena2); pero esta funcion te delvorera 0 si son iguales -1 si la 1º es mayor que la segunda, y 1 si la 2º es mayor que la 1º.

una cosa que no entiendo de tu codigo es esto: pregunta->respuesta, que es eso? creo que no puedes ponerlo asi porque para C - es operador menos y > es mayor que, son operadores reservados, no se que pretendes con eso.

la funcion que utilizas strcpy no puede llamarse asi por lo menos en BORLAND, lleva como argumentos dos cadenas, y siempre copia lo de la 2º enla 1º: strcpy(cadena1,cadena2);

ahora si no quieres comparar cadenas y lo que quieres en comparar caracteres(de un vector de char), usa un bucle for que compare cada elemento de (char) c[cont] == 'x'(caracter); dentro de un if eso si.

cuando tu defines un vector de tipo char da = que le metas un simbolo, un numero o una letra de igual forma se tratan como caracteres asi que no tienes que comprobar nada, puedes hacer la conversion de char a int tipo entero por ejemplo.

como tu haces tu programa tu sabes en que indice de ese vector vas a guardar el sexo del personaje, pues compara ese indice con el caracter que quieres en un if, en tus if no le estas indicando en que indice quieres comparar, es decir:

if ( entrada[3] == 'f' || entrada[3] == 'F')
{
haz esto
}
tambien te puedes ahorrar algo en el if de la siguiente forma:

if ( toupper( entrada[3] ) == 'F')
{
haz esto
}

to upper esta en la libreria <ctype.h> ( en borland ) y sirve para convertir a mayuscula un caracter, al contratio seria tolower (minuscula)

no se si te abre servido de algo, sino pues vuelver a explicarte de otra forma aver si te entiendo mejor
  #3 (permalink)  
Antiguo 09/12/2009, 11:03
Avatar de calathea  
Fecha de Ingreso: octubre-2008
Ubicación: Valladolid
Mensajes: 122
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Comparaciones tipo char

el funcionamiento de gets, getc, strcpy y strcmp lo conozco...

Cita:
una cosa que no entiendo de tu codigo es esto: pregunta->respuesta, que es eso? creo que no puedes ponerlo asi porque para C - es operador menos y > es mayor que, son operadores reservados, no se que pretendes con eso.
Eso es una estructura...de la estructura pregunta la variable respuesta

Cita:
la funcion que utilizas strcpy no puede llamarse asi por lo menos en BORLAND, lleva como argumentos dos cadenas, y siempre copia lo de la 2º enla 1º: strcpy(cadena1,cadena2);
Ya le paso dos cosas...la primera cadena es la estructura (pregunta->respuesta) y la segunda es el caracter correspondiente en ASCII al 11 o 12 dependiendo del caso

El toupper lo uso en otros trozos de código, aqui no me di cuenta de usarlo...pero vamos q no es razón para que no funcione...
  #4 (permalink)  
Antiguo 09/12/2009, 11:30
 
Fecha de Ingreso: diciembre-2009
Mensajes: 5
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Comparaciones tipo char

eso es de una estructura?? que yo sepa se llama a las variables de una estructura de otra forma no asi, pero bueno.

la estructura: (struct) estructura[indice].(atributo);

asi si se llama a un atributo de una estructura. a lomejor el C es una modificacion tuya...

que es lo que te falla?

am y al strcpy solo le puedes pasar cadenas no caracteres que tu quieras, busca en la ayuda del programa
por eso se llama "string copy" para copiar dos cadenas, no lo que tu kieras, a parte que lo que te e diccho si tienes un array de ese tipo ¿donde pones el indice?

Última edición por zooo; 09/12/2009 a las 11:36
  #5 (permalink)  
Antiguo 09/12/2009, 12:37
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: Comparaciones tipo char

puede que lo que le falte sea:

#include<string.h>
  #6 (permalink)  
Antiguo 11/12/2009, 02:45
Avatar de calathea  
Fecha de Ingreso: octubre-2008
Ubicación: Valladolid
Mensajes: 122
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Comparaciones tipo char

Cita:
Iniciado por stiwi222 Ver Mensaje
puede que lo que le falte sea:

#include<string.h>
La tengo ya puesta...asique eso no es... =(

Cita:
Iniciado por zooo Ver Mensaje
eso es de una estructura?? que yo sepa se llama a las variables de una estructura de otra forma no asi, pero bueno.

la estructura: (struct) estructura[indice].(atributo);
Sin ánimo de ofender...creo que deberías revisarte lo de estructuras antes de nada...la flechita -> es un apuntador...yo tengo la estructura como un puntero, por lo que no puedo acceder a ella con el operador .

Cita:
Iniciado por zooo Ver Mensaje
a parte que lo que te e diccho si tienes un array de ese tipo ¿donde pones el indice?
estoy comparando el array ENTERO, no tengo que poner indices...

Lo que me falla es la comparación de los if...no me compara bien...Antes lo tenía con strcmp y no iba tampoco.No se si es porque lo segundo es sólo un caracter o por qué... Alguin sabría decirme como realizar la comparación bien???

Gracias
  #7 (permalink)  
Antiguo 11/12/2009, 10:15
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Comparaciones tipo char

Lo que veo es que estas comparando una dos caracteres
y la funcion strcmp y la strcpy recibe dos cadena de texto
lo que puedes hacer es cambiar el tipo de dato de respuesta en la estructura que tienes como un array (char respuesta[])
y lo mismo haces con la variable entrada.

Espero te sirva

Saludos
Mhax
  #8 (permalink)  
Antiguo 12/12/2009, 08:31
Avatar de calathea  
Fecha de Ingreso: octubre-2008
Ubicación: Valladolid
Mensajes: 122
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Comparaciones tipo char

no puedo cambiar la declaración de entrada y respuesta..porque otras veces puede adoptar otros tamaños mayores de un solo caracter...
de todas formas solucioné anoche mi problema...de forma un poco rudimentaria, porque no era exactament lo que buscaba, pero igualmente efectiva...

Gracias a todos por la ayuda prestada, un saludo!
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 02:42.