Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ramona98 en 27 Agosto 2013, 16:01 pm



Título: Error al comparar cadenas en estructuras
Publicado por: ramona98 en 27 Agosto 2013, 16:01 pm
Hola,

No se que problema puede existir pero no obtengo el resultado deseado:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
//Exercise 12-4: Write a program that lists all the planes that leave from two
//airports specified by the user.
 
int main(void)
{
   int i;
   char city1[2], city2[2]; // airports specified by the user
 
 struct airline {
   int flight_N; // Flight number
   char origin_airp[];  // Originating airport code (three characters)
   char desti_airp[]; //Destination airport code (three characters)
   int start_time[];  //Starting time
   int arrive_time[];  //Arrival time
   };
 
  struct airline myfli[4];
 
 
    myfli[0].flight_N = 329;
strcpy(myfli[0].origin_airp,"ABC");
strcpy(myfli[0].desti_airp,"KID");
myfli[0].start_time[0] = 05;
myfli[0].start_time[1] = 30;
myfli[0].arrive_time[0] = 10;
myfli[0].arrive_time[1] = 55;
 
myfli[1].flight_N = 323;
strcpy(myfli[1].origin_airp,"CCC");
strcpy(myfli[1].desti_airp,"LLI");
myfli[1].start_time[0] = 05;
myfli[1].start_time[1] = 30;
myfli[1].arrive_time[0] = 9;
myfli[1].arrive_time[1] = 55;

myfli[2].flight_N = 559;
strcpy(myfli[2].origin_airp,"BBB");
strcpy(myfli[2].desti_airp,"AAA");
myfli[2].start_time[0] = 07;
myfli[2].start_time[1] = 30;
myfli[2].arrive_time[0] = 10;
myfli[2].arrive_time[1] = 55;
   
    strcpy(city1,"ABC");
    strcpy(city2,"CCC");
   
   
    for (i = 0; i < 4; ++i) {
   
    if (strcmp(myfli[i].origin_airp, city1) == 0 || strcmp(myfli[i].origin_airp, city2) == 0 ){
        printf("Plane Numer: %d\n", myfli[i].flight_N); }
   
    }
 
 
return (0);
}

En el ultimo for y if intento rastear todos los registros de la estructura buscando si coinciden las cadenas city1 y city2 para imprimirlas, pero el resulado impreso no tiene nada que ver con los datos que tenemos :(


Gracias y saludos!


Título: Re: Error al comparar cadenas en estructuras
Publicado por: rir3760 en 27 Agosto 2013, 16:21 pm
Errores importantes hay varios:

* No indicar el numero de elementos de los arrays:
Código
  1. struct airline {
  2.   int flight_N; // Flight number
  3.   char origin_airp[];  // Originating airport code (three characters)
  4.   char desti_airp[]; //Destination airport code (three characters)
  5.   int start_time[];  //Starting time
  6.   int arrive_time[];  //Arrival time
  7. };
Ahí los arrays de caracteres debes declararlos con cuatro elementos, los arrays de enteros con dos.

* El numero de elementos en los arrays "city1" y "city2" esta mal, deben tener cuatro elementos (para los tres caracteres mas el '\0').

* Declaras el array "myfli" con cuatro elementos pero solo asignas valores a los primeros tres.

Un saludo


Título: Re: Error al comparar cadenas en estructuras
Publicado por: ramona98 en 28 Agosto 2013, 09:29 am
Gracias!

Mis preguntas,
- segun tenia entendido, para los strings era mejor definirlos sin indicar el numero de elementos [], para las estructuras no es igual?

- en los arrays de int siempre hay que definir los elemenots?

_ en las estrucutras, tambien tenemos que definir previamente los elementos? que pasaria si quiero crear tantos elementos como el usuario quiero para "myfli"

gracias y perdonen a un principiante ;)


Título: Re: Error al comparar cadenas en estructuras
Publicado por: do-while en 28 Agosto 2013, 10:23 am
¡Buenas!

Te veo un poco liada. En principio tienes las siguientes formas de declarar un vector:
Código
  1. tipo nombre[tamaño]; //vector sin inicializar
  2. tipo nombre[tamaño] = {valor_1, valor_2, ... , valor_n}; //n < tamaño
  3. tipo nombre[] = {valor_1, valor_2, ... , valor_n}; //vector de n elementos inicializado
  4. tipo *nombre = {valor_1, valor_2, ... , valor_n};
  5. char nombre[tamaño] = "una cadena con menos de tamaño-1 caracteres";
  6. char nombre[] = "la cadena que tu quieras";
  7. char *nombre= "la cadena que tu quieras";
  8.  

Si utilizas un puntero o corchetes sin indicar un tamaño, el tamaño vendrá dado por la longitud de la lista de inicialización o si utilizas una cadena para inicialiar un vector de caracteres, por la longitud de dicha cadena. Si no inicializas el vector en el momento en el que lo declaras, solo tendrás un puntero a alguna parte de la memoria que no sabrás cual es. Si has utilizado la notación de corchetes este puntero no podrá modificarse, por lo que habrás conseguido tener un puntero que no te sirve para nada ( ;D) y si has utilizado la notación de puntero si que podrás apuntar a donde quieras, pero en principio no tendrás ningun valor almacenado ni el puntero apuntara a una zona de memoria en la que puedas almacenar información.

Si utilizas corchetes indicando un tamaño, tendras un conjunto de bytes en memoria donde puedas leer y escribir datos de forma segura, siempre y cuando no te salgas fuera de dicho tamaño. En el caso de las cadenas de caracteres recuerda que tienes un caracter adicional, '\0', que indica donde termina la cadena, por lo que como mucho podrás almacenar tamaño - 1 caracteres.

Si no te queda claro, avisa.

¡Saludos!