Bạn xem xét kỹ chưa? Chưa thì xem lại đi!
Bạn có hiểu fgets hoạt động như thế nào chưa? Nhận gì và trả về gì? Chưa thì đọc ở cppreferences.
Bạn có tự hỏi là search_for có giá trị đúng như bạn mong muốn không? Chưa thì viết thêm dòng như printf("search_for: '%s'\n", search_for); là xong, bỏ %s vào trong dấu '' để xem các ký tự thuộc loại không-hiển-thị như tab, carriage return '\r', line feed '\n', khoảng trắng,…
Lập trình thì phải debug có tâm chút. Ở mức chương trình nhỏ này với lỗi code logic, cách dễ nhất là cứ in ra hết giá trị ở những chỗ “đáng nghi” như sau các phép toán, sau lời gọi hàm do mình tự viết, sau lời gọi hàm có sử dụng tham biến, trước lời gọi hàm của các hàm chỉ nhận tham số,… Đã là debug thì cứ viết cho rõ ràng như “search_for (after fgets): %s”, … để biết được biến đang in giá trị ra ở chỗ nào, thêm luôn macros như __FILE__ hay __LINE__, __FUNCTION__, … gíup dễ tìm thấy chỗ lỗi hơn.
Bằng cách quan sát giá trị biến đầu vào, biến đầu ra rồi so sánh với kết quả mong muốn thì mới biết chỗ nào có lỗi.
Với lại, thêm có mấy cái printf, có khó gì đâu mà không ai chịu làm hết vậy? Lỗi này đã xuất hiện rất nhiều lần ở daynhauhoc luôn. Qúa lười để xóa thì thêm vài cái đánh dấu như /*DEBUG*/ vào đầu dòng của printf chẳng hạn, rồi dùng regular expression mà xóa nó đi thôi :v
Viết cho dài vậy thôi chứ lỗi nằm ở fgets, nó lấy luôn cái '\n' bỏ vào thành "town\n" nên không ra kết qủa là đúng rồi. Sửa thì search_for[strlen(search_for) - 1] = 0;