在使用scanf语句的时候,经常性的会报错的问题,以下是解决方案
编译器问题
如果你遇到了在一个编译器上可以运行而在另一个编译器上不能运行时,你就要考虑编译器的问题了。在VS编译器中,scanf会被编译器判定为可能会出现缓冲区溢出的安全隐患。而在dev-C++以及VC6.0等编译器则不会出现此问题。在VS中使用scanf会报一条警告级别3的错误C4996,这条错误在在线文档中这么被描述:
Visual Studio 库中的许多函数、成员函数、函数模板和全局变量已弃用。 某些函数/变量(例如 POSIX 和 Microsoft 特定的函数)被弃用的原因是它们现在使用不同的偏好名称。 某些 C 运行时库函数被弃用的原因是它们不安全,而现在具有更安全的变体。 其他函数/变量被弃用的原因是它们已过时。 弃用消息通常包括已弃用函数或全局变量的建议替换项。
/sdl(启用附加安全检查)编译器选项会将此警告升级为错误。
这是报错信息:
'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
“scanf”:此函数或变量可能不安全。建议使用 scanf_s 代替。要禁用弃用警告,请使用 _CRT_SECURE_NO_WARNINGS。有关详细信息,请查看在线帮助。
解决办法
首先,是你可以替换所有的scanf替换为VS编译器所建议的另一个函数scanf_s,这条语句和scanf几乎没有任何区别,也就是所谓“更安全的变体”。在默认的visual studio 库中,scanf已经被认为是不安全的,已经被弃用了。如果你依旧要使用原原本本的scanf,除了警告C4996外,他还会给出警告C6031,这条警告不会升级为错误。如果要将其关闭,需要检查函数的返回值。
其次,你可以关闭警告:在代码的前面声明关闭警告
#define _CRT_SECURE_NO_WARNINGS 1
这样做可以使得代码的可移植性更好一点,再代码复制来复制去的,把scanf改来改去
或者,你也可以只关掉这一条命令的警告:
#pragma warning(suppress : 4996)
//你也可以将4996替换为6031关闭警告C6031
值得注意的是,#define _CRT_SECURE_NO_WARNINGS 1只对所在文件有效,写入头文件然后在其他文件中声明包含有这条定义的头文件是不起作用的,而#pragma warning(suppress : 4996)可以起作用。

1万+

被折叠的 条评论
为什么被折叠?



