scanf
和scanf_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)
答案 0 :(得分:26)
这是一个专门属于Microsoft编译器的函数。
scanf
最初只是读取您键入的任何控制台输入,并将其分配给一种变量。
如果您有一个名为first_name[5]
的数组,而您使用scanf
代表“Alex”,则没有任何问题。如果你有相同的数组并分配“亚历山大”,你可以看到它超过了数组包含的5个插槽,所以C仍然会将它写在不属于该数组的内存中,它可能会或可能不会使程序崩溃,取决于某些东西是否试图访问和写入不属于first_name的内存插槽。这是scanf_s
的用武之地。
scanf_s
有一个参数(参数),您可以在其中指定缓冲区大小并实际控制输入的限制,这样您就不会崩溃整个建筑物。
答案 1 :(得分:10)
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)
答案 3 :(得分:-2)
为避免此错误,您可以做的是将事物粘贴到<>之间: < _CRT_SECURE_NO_WARNINGS> 到一个地方。 要到达该位置,请右键单击解决方案资源管理器中的项目,然后单击属性。然后转到配置属性,然后转到c / c ++,再转到预处理器。然后在预处理器定义中,在所有内容之后,添加一个分号并粘贴该内容。然后按apply并确定。你的问题应该解决了。