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;
}
Code này lỗi, hàm
fgets
sẽ đọc luôn dấu enter vào trong cái chuỗisearch_for
, dẫn đến khi mình nhậptown
thìsearch_for
sẽ chứa thêm\n
.Bỏ cái
\n
cuối cùng đi với dòng lệnhsearch_for[strlen(search_for) - 1] = 0;
Code mẫu
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 đó.
Em nghĩ đoạn này nên đổi thành:
Ừ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