c - 为什么 gets() 不起作用?

标签 c

我在 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/

相关文章:

python - 把python代码翻译成c代码有那么难吗?

c - 在 GDB 中打印多个变量?

linux - 如何以编程方式读取文件中的某个字符?

c - Linux/C 如何正确结束命令行程序

围绕 -ffast-math 的 gcc 链接器行为的奇怪结果

c# - 在 O(n) 时间内创建链表的拷贝

c - 为什么 FFmpeg 的 af_atempo 过滤器必须在 [0.5, 2.0] 范围内?

main 中的 C 函数错误 LNK2019

c - 错误 : expected expression before ';' token char

c++ - 为什么我只能将文件中的位置指示器 (SetFilePointerEx) 移动 512 乘数?