› Foros › PC › Software libre
/*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++;
}
}
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).
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>
codestation escribió:En todo caso revisa el fichero por si tienes basura al inicio del mismo (fin de linea, unicode BOM, etc).