01/10/2018, 13:57

Thắc mắc về lệnh fscanf và fscanf_s

Mọi người cho em hỏi về lệnh fscanf và fscanf_s:

fscanf(f, "%d|%[^|]|%d", &a, &b, &c);

chương trình sẽ chạy mà không báo lỗi. Còn nếu:

fscanf_s(f, "%d|%[^|]|%d", &a, &b, &c);

chương trình sẽ không chạy được. Em không hiểu lý do tại sao mong mọi người giải đáp giúp em ạ.
Em xin chân thành cảm ơn.

X viết 16:05 ngày 01/10/2018

Em nên cung cấp thêm thông tin:
Lỗi gì? Đang dùng IDE/compiler gì?

Hứa Anh Minh viết 16:12 ngày 01/10/2018

Do Microsoft thấy các hàm trong thư viện stdio.h có nhiều nguy hiểm phát sinh do không kiểm soát được bộ nhớ trong quá trình thao tác nên đã làm lại các hàm đó và thêm _s phía sau.

明玉 viết 16:10 ngày 01/10/2018

Chăm chỉ dùng google và đọc thật kĩ những gì mà Microsoft viết:
https://msdn.microsoft.com/en-us/library/6ybhk9kc.aspx

rogp10 viết 16:06 ngày 01/10/2018

Thớt nên tránh xa những hàm non-standard như thế này.

Quang_Khai viết 16:05 ngày 01/10/2018

Em đang dùng VS ạ. Nếu code như dòng dưới nó sẽ báo stop working ạ. Còn như dòng trên thì lại không bị gì cả. Em không hiểu lý do tại sao.

Quang_Khai viết 16:13 ngày 01/10/2018

Dạ em thêm _s nó lại không chạy được ạ. Nên em mới thắc mắc không hiểu tại sao?

明玉 viết 16:01 ngày 01/10/2018

Vì bạn chưa biết cách dùng nó.
Thế này là sai:

fscanf_s(f, "%d|%[^|]|%d", &a, &b, &c);

Thế này mới đúng (viết kích thước xen vào như vầy):

fscanf_s(f, "%d|%[^|]|%d", &a, sizeof(a), &b, sizeof(b), &c, sizeof(c));

Nếu dùng cho chuỗi (vd char* a), thì bạn dùng cái này: strlen(a) thay thế.
Nếu dùng cho chuỗi (vd char* a) thì a phải đc cấp phát đàng hoàng (dù là tĩnh hay động) và bạn truyền độ dài tính theo số byte vào thay vì dùng sizeof.
Mục đích của những function _s là tránh buffer overflow.

Quang_Khai viết 16:03 ngày 01/10/2018

Dạ em nhiều cảm ơn ạ!!

rogp10 viết 15:57 ngày 01/10/2018

bạn dùng cái này: strlen(a) thay thế

Cái này thì không được, phải là buffer size chứ.

明玉 viết 16:04 ngày 01/10/2018

buffer size gì? mình lấy đúng độ dài theo byte rồi.

rogp10 viết 16:12 ngày 01/10/2018

buffer size gì? mình lấy đúng độ dài theo byte rồi.

Vậy thì lúc a chưa được khởi tạo thì nội dung của nó là gì? strlen() là tính theo nội dung.

明玉 viết 15:59 ngày 01/10/2018

À đúng rồi, nhầm qua hàm printf

Bài liên quan
0