На основе этого кода (а), вот что вам нужно, чтобы проверить, как минимум:
- Это
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
:-)
Это может быть много причин, но без дополнительного кода трудно сказать –
Здесь недостаточно кода для его отладки. – Yuushi
есть что-нибудь, что вызывает его внутри функции? – Alex