2013-04-15 3 views
-1

здесь есть функция, где им получать ошибки сегментацииC-язык, где ошибка сегментации?

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

не уверен, что может быть причиной, чтобы это произошло.

+5

Это может быть много причин, но без дополнительного кода трудно сказать –

+1

Здесь недостаточно кода для его отладки. – Yuushi

+0

есть что-нибудь, что вызывает его внутри функции? – Alex

ответ

0

На основе этого кода (а), вот что вам нужно, чтобы проверить, как минимум:

  • Это searchedcity имеет достаточно места для ввода (б).
  • Что все строки, хранящиеся в связанном списке citylist, правильно построены (с нулевым завершением).
  • Что все эти поля в структуре являются фактически символьными массивами (или эквивалентными указателями), а не целыми числами (например, население).
  • То, что сам список правильно построен (нет свисающих или недействительных указателей).

У вас есть одна другой проблемы, хотя ничего не делать с Segfault.

Ваш код будет печатать "sorry, couldnt find that city" для каждый узла в списке, который не соответствует своему городу так, если у вас есть New York, Moscow и London, и вы посмотрите на London, вы получите, что сообщение печатается дважды он находит это.

Лучшее решение (один из многих вариантов) будет что-то вроде:

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

Таким образом, цикл отвечает за либо найти правильный указатель или установить его в NULL. После петля - правильное время, чтобы решить, что должно быть напечатано.


(а) Это сам код, кажется, хорошо, кроме опасного scanf, но это зависит от довольно много других вещей, не показано.

(б) На самом деле, scanf с неограниченным %s серьезная дыра в коде, который легко может привести к переполнению буфера. См. here для получения более подробной информации и решения. В любом случае, scanf("%s") не является хорошим способом для сканирования строк с пробелами в них, так как что-то вроде Los Angeles бы в конечном итоге, как Los :-)

-1

код ниже работ, я незначительные изменения вы можете пройти через него. Немногочисленные небольшие ошибки, которые у вас были, были вашими ptr->, которые никогда не выполнялись из-за отсутствия скобки. Остальное я написал в коде.

Спасибо, что помогли.

#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

Пожалуйста, объясните, что 'ptr-> next' не был выполнен в исходном коде. Перемещение его внутри фигурных скобок не влияет на цикл, так как оно не будет _in_ цикла, если оно было NULL. – paxdiablo

+2

@paxdiablo О, он имеет хороший эффект ... он создает бесконечный цикл, когда город найден. Цикл ошибочен, но это не исправление. –

Смежные вопросы