首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >scanf和scanf_s的区别

scanf和scanf_s的区别
EN

Stack Overflow用户
提问于 2014-01-29 22:59:11
回答 3查看 92.6K关注 0票数 33

scanfscanf_s有什么区别?在大学里,我一直在学习和使用scanf,但在我的个人电脑上,Visual Studio一直在发送这个警告。

代码语言:javascript
运行
复制
 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.

我必须将所有scanf更改为scanf_s,否则程序将无法构建。(我正在使用Visual Studio 2013)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-30 02:51:00

它是一个专门属于Microsoft编译器的函数。

scanf最初只是读取您键入的任何控制台输入,并将其赋给一种类型的变量。

如果您有一个名为first_name[5]的数组,并且使用scanf表示"Alex",则没有问题。如果你有相同的数组并且赋值为"Alexander",你可以看到它超过了数组包含的5个插槽,所以C仍然会将它写在不属于该数组的内存上,它可能会也可能不会使程序崩溃,这取决于是否有人试图访问和写入不属于first_name的内存插槽。这就是scanf_s的用武之地。

scanf_s有一个参数(参数),你可以在其中指定缓冲区大小,并实际控制输入的限制,这样你就不会使整个建筑崩溃。

票数 37
EN

Stack Overflow用户

发布于 2014-07-09 18:32:41

C99标准(或以前的标准)没有对scanf_s()进行描述。

如果您想使用面向C99 (或以前版本)的编译器,请使用scanf()

对于C11标准(以及后来的标准),使用scanf_s()比使用scanf()更难,以提高防止缓冲区溢出的安全性。

C11 fscanf_s()http://port70.net/~nsz/c/c11/n1570.html#K.3.5.3.2

代码语言:javascript
运行
复制

如果您有一个带有额外功能的C99编译器,它提供了scanf_s()作为扩展,并且不介意失去可移植性,请查看您的编译器文档。

票数 12
EN

Stack Overflow用户

发布于 2015-08-01 00:37:58

要避免此错误,可以将<>:<_CRT_SECURE_NO_WARNINGS>之间的内容粘贴到某个位置。要找到该位置,请在解决方案资源管理器中右键单击您的项目,然后单击属性。然后转到配置属性,然后转到c/c++,然后转到预处理器。然后在预处理器定义中,在所有内容之后,添加一个分号并将其粘贴进去。然后按apply和ok。你的问题应该得到解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21434735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档