scanf和scanf_s之间的区别
所以我想问一下这两者有什么区别。如果有的话。在大学里,我接受过教学,我正在使用scanf,但在我的个人电脑上,视觉工作室不断发出警告。
error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.
我必须将所有scanf更改为scanf_s,否则程序将无法构建。 (我从2013年开始使用ms visual studio的最新版本)
它是一个专门属于Microsoft编译器的函数。
scanf
最初只是读取您键入的任何控制台输入并将其分配给一种变量。
如果您有一个名为first_name[5]
的数组,并且您使用scanf
作为“Alex”,则没有问题。 如果你有相同的数组并分配“亚历山大”,你可以看到它超过了数组包含的5个插槽,所以C仍然会将它写在不属于该数组的内存中,它可能会也可能不会使程序崩溃,取决于某些东西是否试图访问和写入不属于first_name的内存插槽。 这是scanf_s
用武之地。
scanf_s
有一个参数(参数),您可以在其中指定缓冲区大小并实际控制输入的限制,这样您就不会崩溃整个建筑物。
C99标准(或之前的标准scanf_s()
没有描述scanf_s()
)。
如果要使用以C99(或之前的)为目标的编译器,请使用scanf()
。
对于C11标准(以及最后的标准), scanf_s()
比scanf()
更scanf_s()
以提高对缓冲区溢出的安全性。
C11 fscanf_s()
: http : fscanf_s()
~~~~~~~~~~~~~~~~
如果您的C99编译器附加了scanf_s()
作为扩展,并且不介意丢失可移植性,请检查编译器文档。
您可以采取哪些措施来避免此错误,即将事物粘贴到<>:<_ CRT_SECURE_NO_WARNINGS>之间。 要到达该位置,请在解决方案资源管理器中右键单击您的项目,然后单击属性。 然后转到配置属性,然后转到c / c ++,再转到预处理器。 然后在预处理器定义中,在所有内容之后,添加一个分号并粘贴该内容。然后按apply并确定。 你的问题应该解决。
顺便说一句,你的编译器给你一个错误的原因,并且停止,而不是实际上是“警告”问题,你必须安装Visual Studio,以便“将所有警告视为错误”。 更改配置以使警告成为警告,然后您也可以忽略此警告。