Problema con función C al leer de fichero

A ver, porque me estoy volviendo loco, estoy haciendo un programa para una práctica y de forma abreviada la zona problemática consta de lo siguiente:

/*Variable global*/
char ciudad[CIUDADES][25]


/*Función que lee de fichero y guarda las ciudades en un array*/
for(i=0;i<CIUDADES;i++)
  fscanf(fciudades,"%s",ciudad[i]);


compara_cadenas(char ciudad1[25],char ciudad2[25]{

/*Función que busca dos cadenas en el array leído*/
int ciud1_found,ciud2_found; /*Banderas para salir del bucle*/

ciud1_found=0;
ciud2_found=0;
i=0;
while (((ciud1_found)*(ciud2_found))==0){
  if(strcmp(ciudad1,ciudad[i])==0){
   ciud1_found=1;
   ciud1=i;
  }

  else {
   if(strcmp(ciudad2,ciudad[i])==0){
    ciud2_found=1;
    ciud2=i;
   }
  }
  i++;
}
}


Me lee todos los datos y los compara perfectamente; menos el primero; que a la hora de hacer el strcmp() no entra en ningún if y acaba con un mensaje de "Violación de segmento".

El caso es que veo que en el array lo guarda tal cual, por lo que no se si igual el fscanf guarda un principio de fichero o algo así al principio del mismo... No sé si me he explicado bien, mi problema es no al leer del fichero, que lo hace bien; sino al comparar el primer dato leído con una cadena introducida.
Pues esa función tiene muuuchas partes donde puede fallar (variables de condición sin inicializar, la condición para salir del while no es la mejor, si alguna de las dos cadenas a buscar no se encuentra da lugar a un segmentation fault ya que seguiría iterando indefinidamente, se desconoce el valor de i al entrar a la función (por lo menos yo, ya que no lo has puesto), etc). Sin un poco más de código es difícil poder ofrecer más ayuda ya que la función que has puesto depende de variables externas.

Por que no tomas un debugger y miras las variables a comparar con el strcmp y te sales de dudas si el fallo es por el fichero o en tu codigo?

En todo caso revisa el fichero por si tienes basura al inicio del mismo (fin de linea, unicode BOM, etc).
codestation escribió:Pues esa función tiene muuuchas partes donde puede fallar (variables de condición sin inicializar, la condición para salir del while no es la mejor, si alguna de las dos cadenas a buscar no se encuentra da lugar a un segmentation fault ya que seguiría iterando indefinidamente, se desconoce el valor de i al entrar a la función (por lo menos yo, ya que no lo has puesto), etc). Sin un poco más de código es difícil poder ofrecer más ayuda ya que la función que has puesto depende de variables externas.

Por que no tomas un debugger y miras las variables a comparar con el strcmp y te sales de dudas si el fallo es por el fichero o en tu codigo?

En todo caso revisa el fichero por si tienes basura al inicio del mismo (fin de linea, unicode BOM, etc).


Las variables de condición están inicializadas antes.
Ésto es lo que me da el gdb:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7880eaa in strcmp () from /lib/libc.so.6
(gdb) print ciudad[0]
$1 = "Albacete", '\000' <repeats 13 times>
(gdb) print ciudad[1]
$2 = "Alicante", '\000' <repeats 16 times>
(gdb) print ciudad[2]
$3 = "Almería", '\000' <repeats 16 times>


Y poniendo un breakpoint antes de strcmp:

ciudad1=0x7fffffffe290 "Albacete"

Hace el if(strcmp(ciudad1,ciudad[i])==0); resulta distinto de cero y sigue en el bucle hasta que peta el programa

Así que no tengo ni idea de qué puede ser...con Albacete es el ÚNICO con el que no funciona el programa...así que ni idea; también he probado a poner primero en el fichero otra ciudad y siempre es el primero el que falla...

Lo que dices de las condiciones del while ya lo sé, pero todavía no he hecho tratamiento de errores...
Cual es el valor de i antes del primer strcmp? Ya que tampoco veo que lo estés inicializando..
está inicializada a cero antes de ese fragmento, perdón por no ponerlo :S

EDITO:

codestation escribió:En todo caso revisa el fichero por si tienes basura al inicio del mismo (fin de linea, unicode BOM, etc).


Es posible que abriendo el .txt con el gvim y copiando todo a otro .txt ahora funcione? ¬¬

Muchas gracias por todo.
4 respuestas