#include<stdio.h>
int main()
{
double x,y;
scanf("%lf %f", &x,&y);
printf("%f %f", x,y);
}
vs提示错误:格式字符串“%f”需要类型“float *”的参数,但可变参数 2 拥有了类型“double *”scanf读入的时候,只能用%lf,不能用%f
另外,今天第一次从vscode转到vs,发现直接用scanf会被警告:错误 C4996 '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.
在官方帮助中查询:
不安全的 CRT 库函数
This function or variable may be unsafe. Consider using
safe-version
instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Microsoft 弃用了某些 CRT 和 c + + 标准库函数和全局函数,因为提供了更安全的版本。 大多数不推荐使用的函数允许对缓冲区进行未检查的读取或写入访问。 它们可能会导致严重的安全问题。 编译器会发出对这些函数的弃用警告,并建议首选函数。
若要解决此问题,建议改为使用函数或变量
safe-version
。 有时您无法实现可移植性或向后兼容性的原因。 仔细验证代码中是否存在缓冲区覆盖或 overread 的情况。 然后,可以关闭警告。若要在 CRT 中关闭这些函数的弃用警告,请定义
_CRT_SECURE_NO_WARNINGS
。若要关闭有关弃用的全局变量的警告,请定义
_CRT_SECURE_NO_WARNINGS_GLOBALS
。有关这些弃用的函数和全局函数的详细信息,请参阅CRT 中的安全功能和保险箱库: c + + 标准库。
CRT 中的安全功能
- 项目
- 2021/12/01
此页面有帮助吗?
许多旧 CRT 函数具有更新、更安全的版本。 如果存在安全函数,则较旧的、安全性更低的版本将标记为已弃用,并且新版本具有
_s
(“安全”)后缀。在此上下文中,"已弃用" 表示不建议使用函数。 这并不意味着计划从 CRT 中删除该函数。
安全函数不会阻止或更正安全错误。 相反,它们会在出现错误时捕获它们。 它们对错误条件进行额外检查。 如果出现错误,它们将调用错误处理程序, (参见 参数验证) 。
例如,
strcpy
函数无法判断它所复制的字符串对于目标缓冲区是否太大。 它的安全对应strcpy_s
项将缓冲区的大小作为参数使用。 因此,它可以确定是否将发生缓冲区溢出。 如果你使用将strcpy_s
11 个字符复制到10个字符的缓冲区中,这就是一个错误,strcpy_s
无法更正你的错误。 但是,它可以检测错误,并通过调用无效参数处理程序来通知您。
消除弃用警告
可通过多种方式消除针对较旧的、安全性更低的函数的弃用警告。 最简单的方法是定义
_CRT_SECURE_NO_WARNINGS
或使用_CRT_SECURE_NO_WARNINGS
杂注。 将禁用弃用警告,但导致出现警告的安全问题仍存在。 最好将弃用警告保持启用状态并利用新的 CRT 安全功能。
两种方法解决:
- 项目->属性->C/C++->预处理器->预处理器定义中添加_CRT_SECURE_NO_WARNINGS。这种方法将在整个项目中禁用弃用警告。
- 在该源文件开头加上#define
注意2中一定要加在最上面!
#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
int main()
{
double x;
scanf("%lf",&x);
printf("%f",x);
}
//还是会报错
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
double x;
scanf("%lf", &x);
printf("%f", x);
}
//这样可以啦