目录
一、问题的由来
二、解决办法
(1)改用安全函数 scanf_s(VS专用)
(2)关闭安全检查(更好用)
(3)将安全检查“永久”关闭(最建议)
一、问题的由来
在VS2022中,当我们在C语言中使用scanf写代码时,VS2022 会在运行时报错,如下图。
其实这里并非是代码错了,而是 VS 编译器的安全检查机制导致的,只有 VS 编译器会报错,在其他平台上直接使用 scanf 都不会报错。
二、解决办法
(1)改用安全函数 scanf_s(VS专用)
可以使用 VS 编译器自带的安全输入函数scanf_s,用法几乎和 scanf 一模一样。只是当字符(串)输入时,需要额外加长度参数。
#include<stdio.h> int main() { char ch; scanf_s("%c", &ch, 1);// 字符最好加 长度参数 int i; scanf_s("%d", &i); // 字符串必须加 长度参数 char str[5]; scanf_s("%s", str, 5);// 最后一个参数是数组大小 printf("ch = %c\ni = %d\nstr = %s\n", ch, i, str); return 0; }从上面的例子看出,使用 scanf_s 其实并不太方便,一个是输入字符(串)时,还需要再多输入一个参数;另一个便是 scanf_s 是VS编译器专用的,在其他平台上使用都会报错,即不可跨平台。
(2)关闭安全检查(更好用)
通过翻译这张图可知,只要在代码开头加一个宏定义便能关闭安全检查,而这个宏定义便是#define _CRT_SECURE_NO_WARNINGS
虽然这样的代码在 VS 编译器中会报警告,但是运行时并不会报错。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char ch; scanf("%c", &ch, 1); int i; scanf("%d", &i); char str[5]; scanf("%s", str, 5); printf("ch = %c\ni = %d\nstr = %s\n", ch, i, str); return 0; }(3)将安全检查“永久”关闭(最建议)
我们已经知道了,在代码的开始加上宏定义 #define _CRT_SECURE_NO_WARNINGS 便能将安全检查关闭。那么我们能不能每次新建一个项目时,在代码的开始便有这个宏定义?
具体方法如下:
首先下载一个十分好用的搜索软件:Everthing(怎么下载就不过多详述),然后在这个软件中找到newc++file.cpp这个文件,右键选择打开方式为笔记本,将宏定义输入进去并保存。
注意:在保存时,可能会提示没有足够的权限修改,那么便右键该文件,找到属性。点击安全,找到编辑,依次按照图中操作,并确定。回到记事本再次保存就行了。
当我们再次新建一个项目时,VS编译器便已经定义宏了,不需要自己每次都定义一遍。
为什么要下Everthing? —— 由于每个人下VS的安装路径都不一样,所以找 newc++file.cpp 的路径就不一样,使用Everthing可以快速且准确的找到该文件,所以还是很推荐大家下载这个搜索软件的。