为什么gets()不起作用?

我在Unix中使用C语言进行编程,我使用gets来读取键盘输入。 我总是得到这个警告,程序停止运行:

 warning: this program uses gets(), which is unsafe. 

有人能告诉我为什么会这样吗?

如前面的答案所述,使用fgets而不是gets

但它并不像gets根本不起作用,它只是非常不安全。 我的猜测是你的代码中有一个与fgets一起出现的错误,所以请发布您的来源。

编辑根据您在评论中提供的更新信息,我有一些建议。

  • 我建议用您的母语搜索一个好的C教程,Google就是您的朋友。 作为一本书,我会推荐The C Programming Language

  • 如果您有新信息,最好将它们编辑到原始post中,特别是如果它是代码,它将使人们更容易理解您的意思。

  • 您正在尝试将字符串(基本上是一个字符数组)读入单个字符,这当然会失败。 你想要做的是如下所示。

     char username[256]; char password[256]; scanf("%s%s", username, password); 

    随意评论/编辑,即使在基本的C.我也很生疏。

编辑2正如詹姆斯德林警告的那样,使用scanfgets一样危险。

gets是不安全的,因为你给它一个缓冲区,但你不告诉它缓冲区有多大。 输入可以写入缓冲区的末尾,相当惊人地炸毁你的程序。 使用fgets代替更好一点,因为你告诉它缓冲区有多大,如下所示:

 const int bufsize = 4096; /* Or a #define or whatever */ char buffer[bufsize]; fgets(buffer, bufsize, stdin); 

…所以如果你给它提供正确的信息,它不会写入缓冲区的末尾并将其搞砸。

稍微加油,但是:

你不必使用const int作为缓冲区大小,但我强烈建议你不要在两个地方都放一个字面数字,因为你不可避免地会改变一个而不是另一个。 编译器可以帮助:

 char buffer[4096]; fgets(buffer, (sizeof buffer / sizeof buffer[0]), stdin); 

该表达式在编译时解析,而不是运行时解析。 键入是一种痛苦,所以我习惯在常用的标题集中使用一个宏:

 #define ARRAYCOUNT(a) (sizeof a / sizeof a[0]) 

……但我和我的纯C已经过了几年,这些天可能有更好的方法。

man gets说:

永远不要使用gets()。 因为如果事先不知道数据就不可能分辨出get()会读取多少个字符,并且因为gets()将继续存储超过缓冲区末尾的字符,所以使用它是非常危险的。 它已被用来打破计算机安全。 请改用fgets()。

gets()不安全。 它需要一个参数,一个指向char缓冲区的指针。 问问自己你有多大的缓冲区以及用户输入输入多长时间而无需点击返回键。

基本上,没有办法用gets()来防止缓冲区溢出 – 使用fgets()。