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)
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)
它是一个专门属于 Microsoft 编译器的函数。
scanf
最初只是读取您键入的任何控制台输入并将其分配给一种变量。
如果您有一个名为的数组first_name[5]
并scanf
用于“Alex”,则没有问题。如果您有相同的数组并分配“Alexander”,您可以看到它超过了数组包含的 5 个插槽,因此 C 仍会将其写入不属于该数组的内存中,它可能会或可能不会使程序崩溃,取决于是否有东西试图访问和写入不属于 first_name 的内存插槽。这就是scanf_s
进来的地方。
scanf_s
有一个参数(参数),您可以在其中指定缓冲区大小并实际控制输入的限制,这样您就不会破坏整个建筑物。
scanf_s()
C99 标准(或以前的标准)没有描述。
如果您想使用面向 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()
功能并且不介意失去可移植性,请查看您的编译器文档。
避免此错误的方法是将 <>: <_CRT_SECURE_NO_WARNINGS> 之间的内容粘贴到某个位置。要到达该位置,请在解决方案资源管理器中右键单击您的项目,然后单击属性。然后转到配置属性,然后是 c/c++,然后是预处理器。然后在预处理器定义中,在所有内容之后,添加分号并将内容粘贴进去。然后按应用并确定。你的问题应该得到解决。