为什么gets()不起作用?

Pei*_*ska 10 c

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

warning: this program uses gets(), which is unsafe.
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么会这样?

T.J*_*der 14

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

const int bufsize = 4096; /* Or a #define or whatever */
char buffer[bufsize];

fgets(buffer, bufsize, stdin);
Run Code Online (Sandbox Code Playgroud)

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

稍微OT,但是:

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

char buffer[4096];
fgets(buffer, (sizeof buffer / sizeof buffer[0]), stdin);
Run Code Online (Sandbox Code Playgroud)

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

#define ARRAYCOUNT(a) (sizeof a / sizeof a[0])
Run Code Online (Sandbox Code Playgroud)

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


pon*_*zao 8

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

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

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

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

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

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

    char username[256];
    char password[256];
    scanf("%s%s", username, password);
    
    Run Code Online (Sandbox Code Playgroud)

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

编辑2正如詹姆斯德林警告的那样,使用scanf就像危险一样gets.


qrd*_*rdl 5

man gets 说:

永远不要使用gets().因为在不事先知道数据的情况下无法判断get()将读取多少个字符,并且因为gets()将继续存储超出缓冲区末尾的字符,所以使用它是非常危险的.它已被用来打破计算机安全.请改用fgets().