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)
发布于 2014-01-30 02:51:00
它是一个专门属于Microsoft编译器的函数。
scanf最初只是读取您键入的任何控制台输入,并将其赋给一种类型的变量。
如果您有一个名为first_name[5]的数组,并且使用scanf表示"Alex",则没有问题。如果你有相同的数组并且赋值为"Alexander",你可以看到它超过了数组包含的5个插槽,所以C仍然会将它写在不属于该数组的内存上,它可能会也可能不会使程序崩溃,这取决于是否有人试图访问和写入不属于first_name的内存插槽。这就是scanf_s的用武之地。
scanf_s有一个参数(参数),你可以在其中指定缓冲区大小,并实际控制输入的限制,这样你就不会使整个建筑崩溃。
发布于 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
如果您有一个带有额外功能的C99编译器,它提供了scanf_s()作为扩展,并且不介意失去可移植性,请查看您的编译器文档。
发布于 2015-08-01 00:37:58
要避免此错误,可以将<>:<_CRT_SECURE_NO_WARNINGS>之间的内容粘贴到某个位置。要找到该位置,请在解决方案资源管理器中右键单击您的项目,然后单击属性。然后转到配置属性,然后转到c/c++,然后转到预处理器。然后在预处理器定义中,在所有内容之后,添加一个分号并将其粘贴进去。然后按apply和ok。你的问题应该得到解决。
https://stackoverflow.com/questions/21434735
复制相似问题