Visual Studio 2015社区版中不可用gets()函数。

12

我在新安装的Visual Studio Community 2015 IDE中遇到了编译器错误(c3861):

我只想使用stdio.h库中的gets()函数,并已将stdio.h文件包含在我的程序中,但编译器显示了如下的编译器错误:

error C3861: 'gets': identifier not found 

我该怎样使用gets()函数才能正确编译我的程序。


也许这是一个Windows Runtime应用程序?请参阅此链接:https://msdn.microsoft.com/zh-cn/library/2029ea5f.aspx - Gusman
@Gusman,有没有办法禁用CRT功能。实际上,我需要gets()函数进行竞赛编程。 - maruf
但它是WinRT应用程序吗? - Gusman
@Gusman,我怎么知道这是不是WinRT应用程序呢?我对WinRT一无所知。 - maruf
好的,那么它就不应该是WinRT应用程序,Windows RT应用程序是为Windows商店设计的。你的应用程序是控制台应用程序吗?发布一些代码,这样我们就可以看到发生了什么。 - Gusman
显示剩余3条评论
5个回答

27

从C11开始,getsgets_s替换。 gets()函数不执行边界检查,因此该函数极易受到缓冲区溢出的攻击。建议使用替代函数gets_s()fgets()

gets_s(buf);
fgets(buf, sizeof(buf), stdin);

8
如果您希望学习有关缓冲区溢出漏洞的知识,您可以按照以下步骤使用它和其他不安全的函数:
1.从解决方案资源管理器中右键单击项目并选择属性 2.导航到配置属性>>C / C ++>>高级 3.将“编译为”值更改为“编译为C代码(/TC)” 4.(可选)如果您想禁用警告,请在“禁用特定警告”中输入其警告号码。

5
< p >由于gets函数可能导致缓冲区溢出,被认为太危险了,因此在最新版本的C和C++中已经被删除。

应该使用fgets代替。使用该函数可以将输入限制在缓冲区的大小范围内。


1

gets_getws在VS 2015中被移除,因为这些函数已经过时。 替代函数是gets_s_getws_s


0
是的,gets()现在不可用。以下方法对我有效:
 int main() {
    char file_name[30];
    cout << "Enter file name:";
    gets_s(file_name);
    cout << endl << "Selected file : "<< file_name;
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接