我在 Unix 中用 C 语言编程,我用gets
它来读取键盘的输入。我总是收到此警告并且程序停止运行:
warning: this program uses gets(), which is unsafe.
谁能告诉我发生这种情况的原因?
我在 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,但是:
您不必使用 aconst int
作为缓冲区大小,但我强烈建议您不要只在两个地方都放一个字面数字,因为以后不可避免地会更改一个而不是另一个。编译器可以帮助:
char buffer[4096];
fgets(buffer, (sizeof buffer / sizeof buffer[0]), stdin);
该表达式在编译时解析,而不是运行时解析。打字很痛苦,所以我曾经在我通常的标题集中使用一个宏:
#define ARRAYCOUNT(a) (sizeof a / sizeof a[0])
...但是我的纯 C 已经过时了几年,现在可能有更好的方法。
如前面的答案中所述,使用fgets
而不是gets
.
但这并不是gets
根本不起作用,它只是非常非常不安全。我的猜测是你的代码中有一个错误也会出现,fgets
所以请发布你的源代码。
编辑 根据您在评论中提供的更新信息,我有一些建议。
我建议用你的母语搜索一个好的 C 教程,谷歌是你的朋友。作为一本书,我会推荐The C Programming Language
如果您有新信息,最好将它们编辑到您的原始帖子中,特别是如果它是代码,这将使人们更容易理解您的意思。
您正在尝试将字符串(基本上是字符数组)读入单个字符,这当然会失败。您想要做的是如下所示。
char username[256];
char password[256];
scanf("%s%s", username, password);
随意评论/编辑,即使在基本的 C 语言中我也很生疏。
编辑 2正如 jamesdlin 警告的那样,使用 ofscanf
与gets
.
man gets
说:
永远不要使用gets()。因为在事先不知道数据的情况下不可能知道gets()会读取多少个字符,而且因为gets()会继续存储超过缓冲区末尾的字符,所以使用起来非常危险。它已被用来破坏计算机安全。请改用 fgets()。
gets() 是不安全的。它有一个参数,一个指向 char 缓冲区的指针。问问自己,你必须制作多大的缓冲区,以及用户可以在不按回车键的情况下输入多长时间。
基本上,没有办法使用gets() 来防止缓冲区溢出——使用fgets()。