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.
Bài liên quan
Em nên cung cấp thêm thông tin:
Lỗi gì? Đang dùng IDE/compiler gì?
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.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
Thớt nên tránh xa những hàm non-standard như thế này.
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.
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?
Vì bạn chưa biết cách dùng nó.
Thế này là sai:
Thế này mới đúng (viết kích thước xen vào như vầy):
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.
Dạ em nhiều cảm ơn ạ!!
Cái này thì không được, phải là buffer size chứ.
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.
À đúng rồi, nhầm qua hàm printf