Sur la base de ce code (a), voici ce que vous devez vérifier au strict minimum:
- Ce
searchedcity
a assez d'espace pour l'entrée (b).
- Que toutes les chaînes contenues dans la liste chaînée
citylist
sont correctement construites (terminées par un caractère nul).
- Que tous ces domaines dans la structure sont en fait des tableaux de caractères (ou pointeurs équivalent) plutôt que des nombres entiers (population, par exemple).
- Que la liste elle-même est correctement construite (pas de pointeurs invalides ou invalides).
Vous avez un autre problème, mais rien à voir avec le segfault.
Votre code sera imprimé "sorry, couldnt find that city"
pour chaque nœud dans la liste qui ne correspond pas à votre ville donc, si vous avez New York
, Moscow
et London
, et vous recherchez London
, vous aurez le message imprimé à deux fois avant il le trouve.
Une meilleure solution (une des nombreuses variantes) serait quelque chose comme:
struct city *ptr = citylist;
while (ptr != NULL)
if (strcmp (searchedcity, ptr->name) == 0)
break;
if (ptr == NULL)
printf ("Sorry, couldnt find that city.\n");
else
printf ("%s, state = %s, pop = %s,r egion = %s, zip = %s\n",
ptr->name, ptr->statecode, ptr->population, ptr->region, ptr->zipcode);
De cette façon, la boucle est responsable de trouver le pointeur soit correct ou lui la valeur NULL. Après la boucle est l'heure correcte pour décider ce qui doit être imprimé.
(a) Ce code lui-même semble bien autre que le scanf
dangereux, mais cela dépend de beaucoup d'autres choses non représentés.
(b) En fait, avec un scanf
%s
est un trou sans bornes sérieux dans votre code qui peut facilement conduire à un débordement de tampon. Voir here pour les détails et la solution. Dans tous les cas, scanf("%s")
n'est pas une bonne façon de numériser des chaînes avec des espaces en eux depuis quelque chose comme Los Angeles
finirait comme Los
:-)
Il pourrait y avoir de nombreuses raisons, mais sans code plus il est difficile de dire –
Il n'y a pas de code presque assez ici pour déboguer cela. – Yuushi
est-ce qu'il y a quelque chose qui le provoque dans la fonction cependant? – Alex