Hỏi về lỗi khi viết hàm có chức năng đọc chuỗi trên 1 dòng nào đó của file trong C

hoibai
File text của em có chứa những từ tiếng anh, mỗi từ 1 dòng, em muốn viết 1 hàm để đọc 1 dòng nào đó mà mình muốn (như trong hình, em muốn đọc tại dòng thứ ‘line’), nếu em viết hẳn vào main thì chạy ngon, nhưng tách ra thành hàm riêng thì nó cảnh báo dòng “return tubimat”: warning: function returns address of local variable. Và chạy thử thì chương trình lỗi không chạy được ạ. Em đang loay hoay không biết cách xử lí như thế nào, mong được chỉ giáo.

Trả về giá trị khai báo trong hàm, khi ra khỏi hàm thì bị hủy. Bạn khai báo mảng char ngoài hàm và truyền vào.

4 Likes

bác có thể nói chi tiết hơn giúp em được k ạ

Mình xin góp ý một tý:

  1. Tham số đầu của hàm, bạn nên truyền vào một mảng như bên dưới:
    int hamTuBiMat(char arrTuChon[], int line)
    Lợi ích là bạn sẽ chỉ cần khai báo một mảng rỗng tuBiMat[20] = {0}; ở main, rồi truyền vào hàm trên bằng cách gọi hàm hamTuBiMat(tuBiMat, 3);.
    Vì nếu kiểu trả về của hàm là một con trở char* thì khó cho bạn thôi.

  2. Tham số “file_bath” bạn chỉ cần ghi ngay lúc gọi hàm “fopen” luôn khỏi truyền vào cho mất công khai báo 2 chỗ.
    Như vầy: f = fopen("filecuaban.txt", "r").

  3. Điều kiện if của bạn trong hàm không hợp lý lắm. Giả sử bạn không mở được file thì cũng return về từ bí mật sao?
    Vậy nên câu lệnh if trong hàm nên kiểm tra điều kiện sai rồi thoát.
    Sửa thành if (f == NULL) return 0; ngay sau khai báo biến.
    Ngoài ra thì mới trả về từ bí mật (Nếu làm theo cách của mình thi trả về 0 hoặc 1 thôi).

  4. Vòng lặp bạn nên duyệt từng ký tự thôi cho nó đỡ sai nhoa. Phần này bạn tự mò nha. :rofl::rofl: chứ không thì toang.

Ý kiến riêng nha. tùy bạn chọn :sweat_smile::sweat_smile:. Mình cũng đang học C.

5 Likes

cảm ơn bác nhé, mình sẽ thử, nhưng có điều, bác có biết tại sao lại sai ở chỗ return không?

Return về biến local là sai rùi.
Vì bạn chỉ khai báo char tubimat[1000] = ""; trong Hàm “tubiMat”. Nên sau khi ra khỏi hàm tức là chương trình chạy tới chỗ ngoặc “}” thì mọi biến được khai báo trong hàm sẽ được hệ điều hành giải phóng -> để trống RAM.
=>Nên khi bạn làm vậy thì kết quả trả về máy sẽ không xác định được.

5 Likes

hay quá bác ơi <3 <3 <3

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