Tôi bối rối bởi sự khác biệt trong hành vi sau đây:fscanf/fscanf_s sự khác biệt trong hành vi
// suppose myfile.txt contains a single line with the single character 's'
errno_t res;
FILE* fp;
char cmd[81];
res = fopen_s(&fp, "D:\\myfile.txt", "rb");
fscanf(fp,"%80s",cmd); // cmd now contains 's/0'
fclose(fp);
res = fopen_s(&fp, "D:\\myfile.txt", "rb");
fscanf_s(fp,"%80s",cmd); // cmd now contains '/0' !
fclose(fp);
Kết quả không phụ thuộc vào thứ tự của cuộc gọi (ví dụ, gọi fscanf_s đầu tiên, bạn sẽ nhận được sự trống rỗng chuỗi đầu tiên). Biên soạn trên VC++ - VS2005. Bất cứ ai có thể sao chép? Bất cứ ai có thể giải thích?
Cảm ơn!
Điều này có vẻ giống như cách sử dụng sai. '81' được cho là kích thước của bộ đệm' cmd'. Nhưng nó là? Đây là cách tốt để viết mã bị treo, ngay cả khi sử dụng chức năng "an toàn". Nên có 'sizeof (cmd)' trong trường hợp đọc vào một mảng ký tự tĩnh, một số biến lưu trữ độ dài bộ đệm được cấp phát, hoặc một cuộc gọi đến chức năng kích thước/dung lượng của một bộ đệm đã cho. Mặc dù ví dụ của bạn về mặt kỹ thuật chính xác nhưng nó có thể gây hiểu lầm cho nhiều người. –