gets
không an toàn vì bạn cung cấp cho bộ đệm, nhưng bạn không cho biết bộ đệm lớn như thế nào. Các đầu vào có thể viết qua phần cuối của bộ đệm, thổi lên chương trình của bạn khá ngoạn mục. Sử dụng fgets
thay vào đó là một chút tốt hơn bởi vì bạn nói nó lớn như thế nào bộ đệm là, như thế này:
const int bufsize = 4096; /* Or a #define or whatever */
char buffer[bufsize];
fgets(buffer, bufsize, stdin);
... do đó, miễn là bạn cung cấp cho nó thông tin chính xác, nó không viết quá khứ cuối của bộ đệm và thổi mọi thứ lên.
Hơi OT, nhưng:
Bạn không cần phải sử dụng một const int
cho kích thước bộ đệm, nhưng tôi sẽ mạnh khuyên bạn không chỉ cần đặt một số chữ ở cả hai nơi, bởi vì chắc chắn bạn sẽ thay đổi một nhưng không thay đổi sau này. Trình biên dịch có thể giúp:
char buffer[4096];
fgets(buffer, (sizeof buffer/sizeof buffer[0]), stdin);
Biểu thức đó được giải quyết tại thời gian biên dịch, không phải thời gian chạy. Đó là một nỗi đau để gõ, vì vậy tôi sử dụng để sử dụng một vĩ mô trong bộ tiêu đề thông thường của tôi:
#define ARRAYCOUNT(a) (sizeof a/sizeof a[0])
... nhưng tôi là một vài năm cũ với C tinh khiết của tôi, có lẽ có một cách tốt hơn những ngày này.
Nguồn
2010-06-04 12:20:54
Đó là một chức năng không an toàn; các cuộc tấn công tràn bộ đệm có thể được phát hành nếu các chương trình sử dụng các chức năng không cung cấp khả năng kiểm tra kích thước bộ đệm – INS
Nếu tôi sử dụng scanf() thay vì được() nó hoạt động, nhưng tôi phải đọc 2 đầu vào từ bàn phím và chương trình dừng lại sau khi tôi đọc cuốn thứ nhất. Tại sao? đây là mã: người dùng char; thẻ vượt qua; printf ("ID người dùng"); scanf ("% s", người dùng); printf ("Mã Pin:"); scanf ("% s", vượt qua); – Peiska
@peiska: Chương trình dừng sau chương trình đầu tiên bởi vì nó đang chờ bạn nhập số thứ hai. Bản thân bạn đặt 'scanf' thứ hai vào đó. Tại sao nó làm bạn ngạc nhiên rằng chương trình "dừng" sau đó? – AnT