01/10/2018, 17:17

Code trong sách Head First C chạy không ra kết quả

em viết chương trình ntn đoạn code dưới là trong sách Head First C nhưng khi em chạy ct thì không ra gì hết

#include <stdio.h>
#include <string.h>


char tracks[][80] = {
    "I left my heart in Harvard Med School",
    "Newark, Newark - a wonderful town",
    "Dancing with a Dork",
    "From here to maternity",
    "The girl from Iwo Jima",
};
void find_track(char search_for[])
{
    int i;
    for (i = 0; i < 5; i++) {
        if ( strstr(tracks[i], search_for))
         printf("Track %i: '%s'
", i, tracks[i]);
    }


}

int main()
{
    char search_for[80];
    printf("Search for: ");
    fgets(search_for, 80, stdin);
    find_track(search_for);
    return 0;
}

Khoa NTA viết 19:22 ngày 01/10/2018

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;

bin1702 viết 19:24 ngày 01/10/2018

à oke bạn, mình làm dc rồi, cảm ơn nha

Bài liên quan
0