30/09/2018, 23:14

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'
", i, tracks[i]);
    }
}
int main()
{
    char search_for[80];
    printf("Search for: ");
    fgets(search_for, 80, stdin);
    find_track(search_for);
    return 0;
}
Mai Anh Dũng viết 01:28 ngày 01/10/2018

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;
}
Ho Cuong viết 01:28 ngày 01/10/2018

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 ạ _ _!

Mai Anh Dũng viết 01:25 ngày 01/10/2018

Dòng search_for[strlen(search_for) - 1] = 0; nôm na là thay \n = 0 đúng không anh!!?!

Đúng.

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

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 đó.

I am Z viết 01:15 ngày 01/10/2018
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;
Mai Anh Dũng viết 01:30 ngày 01/10/2018

Ừ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

Bài liên quan
0