Ví dụ trong sách Head First C không chạy khi dùng hàm strstr để tìm chuỗi nhập vào từ fgets

Hi anh em daynhauhoc, em cũng đang tự học quyển Head First C và gặp bài này(trang 90), sách thì bảo chạy được nhưng em chạy trên codeblook or VS đều không được mặc dù em đã copy y nguyên đáp án trong sách ạ.

Đây là đoạn code đáp án ạ:
Mục đích code: tạo danh sách gồm 5 tên bài hát, người dùng gõ 1 từ bất kỳ, phần mềm sẽ hiển thị toàn bộ tên bài hát có từ đó.
Ví dụ: gõ ‘town’ phần mềm sẽ hiển thị ‘Newark, Newark - a wonderful town’
Nhưng em chạy thì phần mềm không báo gì ạ.Anh em giúp em với TT_TT

#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'\n", i, tracks[i]);
    }
}
int main()
{
    char search_for[80];
    printf("Search for: ");
    fgets(search_for, 80, stdin);
    find_track(search_for);
    return 0;
}

Code này lỗi, hàm fgets sẽ đọc luôn dấu enter vào trong cái chuỗi search_for, dẫn đến khi mình nhập town thì search_for sẽ chứa thêm \n.

Bỏ cái \n cuối cùng đi với dòng lệnh search_for[strlen(search_for) - 1] = 0;

Code mẫu

#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'\n", i, tracks[i]);
    }
}
int main()
{
    char search_for[80];
    printf("Search for: ");
    fgets(search_for, 80, stdin);
    if (search_for[strlen(search_for) - 1] == '\n')
        search_for[strlen(search_for) - 1] = 0;
    find_track(search_for);
    return 0;
}
1 Like

A em hiểu rồi,
Dòng search_for[strlen(search_for) - 1] = 0; nôm na là thay \n = 0 đúng không anh!!?!

Lúc nãy em có thử thay

fgets(search_for, 80, stdin);

thành

fgets(search_for, strlen(search_for) - 1, stdin);

nhưng không được, anh giải thích cho em vì sao với ạ…
Em cảm ơn anh.
Ps: Sry anh em không biết làm thế nào cho dòng code trên nó hiển thì như trong editor như anh ạ _ _!

Đúng.

search_for được tạo ra với giá trị rác bên trong.
strlen(search_for) là một giá trị không đáng tin, nó thay đổi, và mình không biết có gì bên trong đó

Và đơn giản nhất là code như vậy là sai, strlen chỉ tính được chiều dài của chuỗi sau khi em ghi giá trị cho chuỗi, không phải trước đó.

1 Like
fgets(search_for, 80, stdin);
search_for[strlen(search_for) - 1] = 0;

Em nghĩ đoạn này nên đổi thành:

fgets(search_for, 80, stdin);
if (search_for[strlen(search_for) - 1] == '\n')
    search_for[strlen(search_for) - 1] = 0;
2 Likes

Ừm, nên sửa lại như vậy. Bài này là code bài tập vớ vẩn, code lỗi thiết kế tè le ra, hardcode nhiều, nên anh viết bừa.

Đã update trả lời theo recommend của em :thumbsup:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?