我在 Unix 中用 C 编程,
我正在使用 gets
从键盘读取输入。
我总是收到此警告并且程序停止运行:
warning: this program uses gets(), which is unsafe.
有人能告诉我这是为什么吗?
最佳答案
gets
是不安全的,因为你给它一个缓冲区,但你没有告诉它缓冲区有多大。输入可能会超出缓冲区的末尾,从而相当惊人地炸毁您的程序。使用 fgets
会好一些,因为您告诉它缓冲区有多大,如下所示:
const int bufsize = 4096; /* Or a #define or whatever */
char buffer[bufsize];
fgets(buffer, bufsize, stdin);
...所以只要您给它提供正确的信息,它就不会写入超过缓冲区的末尾并破坏一切。
有点 OT,但是:
您不必为缓冲区大小使用 const int
,但我强烈建议您不要只在两个地方都输入文字数字,因为你不可避免地会在以后改变一个而不是另一个。编译器可以帮助:
char buffer[4096];
fgets(buffer, (sizeof buffer / sizeof buffer[0]), stdin);
该表达式在编译时得到解析,而不是运行时。打字很麻烦,所以我曾经在我常用的一组标题中使用宏:
#define ARRAYCOUNT(a) (sizeof a / sizeof a[0])
...但是我的纯 C 已经过时了几年,现在可能有更好的方法。
关于c - 为什么 gets() 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2973985/