很多学习C语言的新手朋友都会遇到scanf,gets等函数在vs上无法使用的问题

#include <stdio.h>

int main()
{
 int a;
 scanf("%d",&a);
 return 0;
}

默认情况会有以上报错

分析:

scanf会有内存溢出的风险,那为什么会有这样的风险呢 请看代码示例

#include <stdio.h>

int main()
{
 char a[10];//声明一个长度为10的字符串
 scanf("%s",&a);
 return 0;
}

此时,如果从屏幕输入了超过10个字符,scanf仍然是会进行赋值的,但很明显字符串a只有10个字符的空间,这时就出现了内存溢出。

也就是说 scanf只负责赋值 但不负责检查是否内存溢出,因此,微软对其进行了限制,在Visual Studio较新版本上默认情况无法直接使用这个函数。

解决方案一:

微软在自家IDE上推出了scanf_s函数用于解决内存溢出的潜在风险,只需在原有代码基础上加上_s即可

#include <stdio.h>

int main()
{
 int a;
 scanf_s("%d",&a);
 return 0;
}

解决方案二:

在源文件的最上面加一行#define _CRT_SECURE_NO_WARNINGS

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
 int a;
 scanf("%d",&a);
 return 0;
}

解决方案三:

右击整个项目,点击属性。

点击C/C++,点击高级,在禁用特定警告里输入4996。

此方法只对当前项目有效,其他项目同样需要手动设置。

总结:

无论是scanf还是gets函数,都是因为内存溢出的潜在风险,导致微软不建议用户使用,初学者可以采用方案一来解决这个问题,但由于此函数只在visual studio里可以使用,笔者建议使用后两种方案。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐