Ver Mensaje Individual
  #8 (permalink)  
Antiguo 05/06/2015, 03:19
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Programa para consultar datos struct

Cita:
Iniciado por Srgy Ver Mensaje
- ¿Que diferencias tengo entre declarar la variable "localidad" como char o char*. Lo digo porque sustituyendo...

Código:
if((localidad[z] == lista[i].ciudad[z])||(localidad[z] == lista[i].ciudad2[z]))
teniendo declarada como char, por la función srtcmp me da error en compilación. Si cambio la declaración a char* entonces me da error la lectura con el

Código:
gets(localidad);
El tipo char únicamente permite almacenar un carácter (8 bits con signo), mientras que el tipo char* es un array de tipo char, lo que te permite almacenar un número indeterminado de caracteres.

La firma de strcmp, tal y como puedes consultar por ejemplo aquí, indica que esta función espera recibir dos punteros a char, es decir, dos char*. Si esta función recibe cualqueir otro tipo de dato, te arrojará un error.

La firma de gets, como puedes consultar aquí, también espera recibir un char*, por lo que no termino de entender ese error que comentas.


Cita:
Iniciado por Srgy Ver Mensaje
Otra cosa es que cuando hago la limpieza del búfer

Código:
cin.ignore(256,'\n');
hay que presionar dos veces enter para que tome el valor, lo cual puede llevar al usuario a no saber esto y creer que el programa se ha "colgado".

Código:
   system("cls");          
   cout<<"Introduce nombre de localidad\n";
   cin.ignore(256,'\n');
   gets(localidad);
Así, al abrir el programa, en la primera selección del switch (1 o 2), tengo que hacer lo siguiente...

-pulso 1 (por ejemplo) y enter . El programa no hace nada.
-Vuelvo a pulsar 1 y enter. El programa entra en el case 1.

He tenido, por tanto, que hacer dos veces esa operación de selección, lo cual no deja de ser algo raro.
El problema aquí es que cin.ignore va a eliminar todo lo que haya en el buffer hasta que se encuentre un salto de línea... si no encuentra el salto de línea y el contenido del buffer no supera los 256 caracteres, cin se quedará esperando a que introduzcas más caracteres hasta completar uno de los dos requisitos.

Una opción más limpia para limpiar el buffer (lo siento, ayer escribí con prisas y me la salté) es usar cin.clear():

Código:
   system("cls");          
   cout<<"Introduce nombre de localidad\n";
   cin.clear();
   gets(localidad);
Cita:
Iniciado por Srgy Ver Mensaje
Respecto a lo de las clases, aún no he entrado en eso. Me está costando algo entender el concepto de clase de C++. Ví algo de C en su día, y esto me pilla de nuevas. Pero vamos, que asumo que este programa sería mucho más sencillo de realizar mediante el uso de clases. Todo llegará.
Cada persona tiene su propia curva de aprendizaje. No te agobies :)

Cita:
Iniciado por Srgy Ver Mensaje
Disculpa por el asedio de dudas y de nuevo mil gracias, con estos consejos voy empezando a tener claras algunas cosas.
Si no fuese para ayudar, no tendría sentido que estuviese en este foro.

Un saludo