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,以便“将所有警告视为错误”。 更改配置以使警告成为警告,然后您也可以忽略此警告。