2013-04-15 1 views
-1

ici est la fonction où im obtenir la faute de segmentationLangage C, où est la faute de segmentation?

void searchcity() 
{ 
    struct city *ptr=citylist; 
    printf("Which city would you like me to search?: "); 
    scanf("%s",searchedcity); 
    // printf("%s",searchedcity); 
    while(ptr) 
    { 
     if(!strcmp(searchedcity,ptr->name)) 
      printf("name= %s, statecode = %s,population = %s,region = %s,zipcode =  %s\n",ptr->name,ptr->statecode,ptr->population,ptr->region,ptr->zipcode); 
     else 
      printf("sorry, couldnt find that city"); 
     ptr=ptr->next; 
    } 
} 

ne sais pas ce qui peut être à l'origine que cela se produise.

+5

Il pourrait y avoir de nombreuses raisons, mais sans code plus il est difficile de dire –

+1

Il n'y a pas de code presque assez ici pour déboguer cela. – Yuushi

+0

est-ce qu'il y a quelque chose qui le provoque dans la fonction cependant? – Alex

Répondre

0

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

-1

code ci-dessous fonctionne, je ne des changements mineurs vous pouvez vous promener à travers elle. Quelques petites erreurs que vous avez eues ont été votre ptr-> next n'a jamais été exécuté en raison d'une parenthèse manquante. Le reste j'ai écrit dans le code.

Merci, nous avons aidé.

#include <stdio.h> 
struct city { 
    char name[100]; 
    char statecode[100]; 
    char population[100]; 
    char region[100]; 
    char zipcode[100]; 
    struct city* next; 
}; 

int main() // this is your searchcity function 
{ 
    char searchedcity[100]; // make sure you initialize this. YOu haven't done it in the code you gave us. 
     // Assume citylist is in your main function or initialized as a global var 
     // I initialized it here for simplicity 
    struct city* citylist = (struct city*) malloc(sizeof(struct city)); 
    strcpy(citylist->statecode,"statecode"); 
    strcpy(citylist->population,"population"); 
    strcpy(citylist->region,"region"); 
    strcpy(citylist->zipcode,"zipcode"); 
    citylist->next = NULL; 
//end of citylist 
    struct city *ptr = citylist; 
    printf("Which city would you like me to search?: "); 
    scanf("%s",searchedcity); 
// printf("%s",searchedcity); 
    while(ptr) { 
     printf("while \n"); 
     if(!strcmp(searchedcity,ptr->name)){ 
       printf("name= %s, statecode = %s,population = %s,region = %s,zipcode =  %s\n",ptr->name,ptr->statecode,ptr->population,ptr->region,ptr->zipcode); 
     }else{ 
       printf("sorry, couldnt find that city"); 
       ptr=ptr->next; 
     } 
    } 
    return 0; 
} 
+1

Veuillez expliquer la prétention que 'ptr-> next' n'a pas été exécuté dans le code original. Le déplacer à l'intérieur des accolades n'a aucun effet sur la boucle car il ne serait pas _in_ dans la boucle s'il était NULL. – paxdiablo

+2

@paxdiablo Oh, ça a un effet ... ça produit une boucle infinie quand la ville est trouvée. La boucle est fausse, mais ce n'est pas la solution. –