1. 返回值被忽略: “scanf”。
2. '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改成scanf_s就好,其实我这句直接改成scanf_s就好是有问题的,我也不想建议新手养成这种坏习惯,因为这样写会降低代码的可移植性,不具有跨平台性。
第二种方法:把#define _CRT_SECURE_NO_WARNINGS加进去
#define _CRT_SECURE_NO_WARNINGS
这一句话是哪来的?
从输入scanf运行报错后下面的错误里面复制的。
2. '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
。详细信息请参阅在线帮助。”
它还是会有一个警告,但是能够运行了。
如果你觉得每次都要去复制粘贴太麻烦了,
VS2022
项目->Test和属性
C/C++->预处理器->预处理器定义->_CRT_SECURE_NO_WARNINGS
首先说明scanf_s不是C11标准里面的,而是VS编译器提供给我们的。
为什么要为我们提供这个呢?
scanf
函数是一种常用的输入函数,用于从标准输入(通常是键盘)读取数据并将其存储到指定的变量中。然而,由于scanf
在设计上并未对输入长度进行严格的限制,因此在使用时可能会引发一些隐患:
-
缓冲区溢出:
scanf
在读取字符串时,如果输入的字符串长度超过了预留的缓冲区长度,会导致缓冲区溢出。这种溢出可能导致程序崩溃或允许攻击者利用溢出的空间执行恶意代码。 -
未能准确读取:
scanf
在读取数据时,可能无法准确读取到想要的类型或数据量。例如,scanf
可能在遇到空格、换行符等分隔符时停止读取,从而导致读取到的数据不完整或与预期不符。 -
输入错误处理:
scanf
在遇到类型不匹配的输入时,会返回读取的元素数量,但它无法有效地处理错误输入或非法输入。这可能导致程序在执行过程中出现意外情况。 -
无上限输入:
scanf
在读取输入时,没有明确的上限,因此它可能会继续读取输入,直到遇到输入结束。这可能导致输入缓冲区被意外填满,或导致程序卡住等待更多输入。
这里我翻了一下C11的标准,在输入输出函数里面,没有关于scanf_s的定义,结合我百度的资料来看,scanf_s确实只是VS里面引入的一个工具,即使在信息发展如此迅猛,AI工具如此多的时代,我们也要自己多查资料,多翻资料,因为我直接问的AI,它给出了我错误的答案,至少在C11标准里面,scanf_s确实没有被包含在里面。
这里我推荐一款插件,可以把英文翻译成中文,我觉得很赞,而且也有免费的可以使用,是适用于Microsoft Edge浏览器使用的
沉浸式翻译 - 网页翻译插件 | PDF翻译 | 免费 - Microsoft Edge Addons