34

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)

4

3 回答 3

37

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

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

如果您有一个名为的数组first_name[5]scanf用于“Alex”,则没有问题。如果您有相同的数组并分配“Alexander”,您可以看到它超过了数组包含的 5 个插槽,因此 C 仍会将其写入不属于该数组的内存中,它可能会或可能不会使程序崩溃,取决于是否有东西试图访问和写入不属于 first_name 的内存插槽。这就是scanf_s进来的地方。

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

于 2014-01-29T18:51:00.250 回答
12

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()功能并且不介意失去可移植性,请查看您的编译器文档。

于 2014-07-09T10:32:40.523 回答
0

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

于 2015-07-31T16:37:58.333 回答