scanf和scanf_s之间的区别

时间:2014-01-29 14:59:11

标签: c visual-studio scanf tr24731

scanfscanf_s之间有什么区别?在大学里,我接受了教育,我正在使用scanf,但在我的个人计算机上,Visual Studio不断发出此警告。

 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.

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

4 个答案:

答案 0 :(得分:26)

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

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

如果您有一个名为first_name[5]的数组,而您使用scanf代表“Alex”,则没有任何问题。如果你有相同的数组并分配“亚历山大”,你可以看到它超过了数组包含的5个插槽,所以C仍然会将它写在不属于该数组的内存中,它可能会或可能不会使程序崩溃,取决于某些东西是否试图访问和写入不属于first_name的内存插槽。这是scanf_s的用武之地。

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

答案 1 :(得分:10)

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

~~~~~~~~~~~~~~~~

如果您的C99编译器附加了scanf_s()作为扩展名,并且不介意丢失可移植性,请查看编译器文档。

答案 2 :(得分:-1)

BTW,你的编译器给你一个错误的原因,并且停止,而不是问题实际上是“警告”,你必须设置你的Visual Studio,以便“将所有警告视为错误”。更改配置以使警告成为警告,然后您也可以忽略此警告。

答案 3 :(得分:-2)

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