Error al comparar cadenas en estructuras

Iniciado por ramona98, 27 Agosto 2013, 16:01 PM

0 Miembros y 1 Visitante están viendo este tema.

ramona98

Hola,

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

#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!

rir3760

Errores importantes hay varios:

* No indicar el numero de elementos de los arrays:
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
};

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ramona98

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 ;)

do-while

#3
¡Buenas!

Te veo un poco liada. En principio tienes las siguientes formas de declarar un vector:

tipo nombre[tamaño]; //vector sin inicializar
tipo nombre[tamaño] = {valor_1, valor_2, ... , valor_n}; //n < tamaño
tipo nombre[] = {valor_1, valor_2, ... , valor_n}; //vector de n elementos inicializado
tipo *nombre = {valor_1, valor_2, ... , valor_n};
char nombre[tamaño] = "una cadena con menos de tamaño-1 caracteres";
char nombre[] = "la cadena que tu quieras";
char *nombre= "la cadena que tu quieras";


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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!