Trong C11 gets
đã được thay thế bằng gets_s
có khai báo như sau:
char *gets_s(char *str, rsize_t n);
Chức năng này sẽ đọc nhiều nhất n-1
chars từ stdin
vào *str
. Điều này là để tránh lỗ hổng tràn bộ đệm vốn có là gets
. Chức năng fgets
cũng là một lựa chọn. Từ http://en.cppreference.com/w/c/io/gets:
Các được() chức năng không thực hiện kiểm tra giới hạn, do đó chức năng này là cực kỳ lỗ hổng bị tràn tấn công. Nó không thể được sử dụng một cách an toàn (trừ khi chương trình chạy trong môi trường hạn chế những gì có thể xuất hiện trên stdin). Vì lý do này, chức năng này đã không được chấp nhận trong bản sửa đổi thứ ba đối với tiêu chuẩn C99 và được loại bỏ hoàn toàn theo tiêu chuẩn C11. fgets() và gets_s() là các thay thế được đề xuất.
Không bao giờ sử dụng được().
Được xác định trong phần mở rộng cho tiêu chuẩn, chỉ được triển khai tùy chọn, bạn có thể viết chương trình của mình bằng cách sử dụng fgets
thay thế. Nếu bạn sử dụng fgets
trên stdin
, chương trình của bạn cũng sẽ biên dịch trong các phiên bản trước của C. Nhưng hãy ghi nhớ sự khác biệt trong hành vi: khi gets_s
đọc n-1
ký tự nó tiếp tục đọc cho đến khi dòng mới hoặc cuối tập tin được truy cập , loại bỏ đầu vào. Vì vậy, với gets_s
bạn luôn đọc toàn bộ dòng, ngay cả khi chỉ một phần của nó có thể được trả lại trong bộ đệm đầu vào.
fgets (..., ..., stdin) –