VS2019中scanf函数莫名报错怎么办 Visual Studio2019实用小操作介绍

  发布时间:2024-01-22 09:19:17   作者:佚名   我要评论
相信很多小伙伴在第一次使用scanf函数时大概率会遇到系统报错的问题,提示:scanf这个函数或者变量可能不安全 ,考虑使用scanf_s替换,下面我们就来看看详细的解决办法
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

在.c文件中添加宏定义取消错误

在使用vs编译器时,我们使用scanf函数,可能有些小伙伴会疑惑,为什么我的代码没有错误,vs依然报错。

这里有两种方式解决。

第一种方法解释

scanf来源于c语言标准库,vs2019中scanf函数被认为是不安全的,因为它不能保证输入数据的长度不会超过指定的缓冲区的大小,可能导致缓冲区溢出漏洞,为了解决这个问题vs2019提供一组安全版本的输入函数如scanf_s,它是基于c11和c++标准引入的一组安全输入函数,不属于c语言标准库的一部分但是是属于可选的拓展库,stdio.h是c语言标准库中的一个头文件,scanf_s也被支持在此头文件中使用。scanf是C语言提供的,scanf_s是VS提供的,这里我用的是vs编译器,为了保证兼容性,这里可以使用scanf_s,但是如果你们使用的是别的编译器,例如gcc,vc就可以使用scanf.

但是假如一个程序里面大量使用scanf函数或者以后每次编程使用,我们都要一个一个将scanf改成scanf_s是不是过于麻烦了呢?这里我们还没有总结到宏定义,在这里就直接告诉大家一个小技巧。

第二种方法—使用宏定义的方法

例如:

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", a);
	printf("%d\n", a);
	return 0;

把这串字符复制粘贴在代码的开头,加上:''#define _CRT_SECURE_NO_WARNINGS 6''。(一定要放在第一行!!!)#define是宏定义,这里的6是编译器随机给的一个数,这里把他改成任意数字都是可以的。可能你们的编译器上还会报一个scanf返回值被忽略的警告,这个是没关系,代码依然可以运行。

例如:

#define _CRT_SECURE_NO_WARNINGS 6
#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", a);
	printf("%d\n", a);
	return 0;
}

那么代码就能在vs中正常运行。

可是后面如果我每次使用scanf、strcpy、strcat...这些函数时,vs都会提示不安全,那我每次都要在.c文件中都加入''#define _CRT_SECURE_NO_WARNINGS 6'',有没有更方便的办法?我一创建项目就能自动添加这行代码呢?答案当然是能的!(不然我也不会在这里说,这不是打自己的脸吗。)

步骤:

1.这里我们先找到newc++file.cpp这个文件,在这个文件中加入''#define _CRT_SECURE_NO_WARNINGS 1'',以后新建的文件中都会自动加上''#define _CRT_SECURE_NO_WARNINGS 1''。(可以使用之前我分享的工具Everything进行查找文件newc++file.cpp)(Everything等工具讲解链接:http://t.csdn.cn/EJ62i)

例如:

2.接下来我们点击对应的newc++ file.cpp文件,右击鼠标,点击选项》打开路径(o),然后跳到newc++ file.cpp这个文件的位置。例如:

千万不要把这个路径关闭,不然后面可能找不到了。

3.然后我们来到桌面,点击newc++ file.cpp,右击鼠标,选项》打开方式(H),选择一种打开方式,可以是记事本...,这里我就用vs2019打开,打开之后是下面这样空空如也的:

这个时候,我们把''#define _CRT_SECURE_NO_WARNINGS 1'',Ctrl+S保存就可以了。例如:

这个时候关闭vs,复制一下我们电脑桌面的newc++ file.cpp文件,回到我们的路径下面

粘贴替换掉原来的newc++ file.cpp文件,例如:

粘贴完成后,如果不放心,你可以点击newc++ file.cpp文件,右击鼠标,选择》打开方式(o)进行查看,这个时侯就会出现''#define _CRT_SECURE_NO_WARNINGS 1'',例如:

这样以后每次新建项目都会自动加入''#define _CRT_SECURE_NO_WARNINGS 1''.

代码的隐藏

这里我们可能听说过程序员将自己创作的优质代码卖出,例如有一名程序员写了一个比较有价值的代码,他想把这个代码卖个公司,自己维护,然后每年收费,那这是怎么实现的呢?这里我给大家介绍C/C++的一种办法,通过vs2019实现代码的隐藏。

以下列这段代码为例:实现两数的加法运算

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Add(int a, int b)
{
	return a + b;
}
int main()
{
	int a=0;
	int b=0;
	scanf("%d %d", &a, &b);
	int ret=Add(a,b);
	printf("%d\n", ret);
	return 0;
}

现在假设程序员设计的就是这个Add程序,这个程序很有价值,因此他想要把这段代码隐藏起来,卖给另外一个公司。那么怎么在vs中实现代码隐藏呢?

1. 首先把代码的定义(也就是这段代码的实现)放入另一个.c文件(不和main函数放在一个.c文件中)。例如:

2.在使用库函数时,我们知道要使用库函数,必须要引用包含这段库函数的头文件。这里我们自定义一个函数也是如此,需要引用对应源文件的头文件。因此我们需要创建一个头文件,将我们自定义的函数包括进去。例如:

完成后点击添加。这样就是下列图示:

这样Add.h与Add.c就成为一个模块(加法模块)。接下来,我们还要在头文件中添加我们对应创立的源文件(.c)的声明,例如:

这里出现的#pragma once就是创建头文件的意思,这里把它删掉也可以,没有影响。做到这里,我们把源文件(.c)和头文件(.c)都准备好了,那么接下来就是在主函数中引用了。例如:

这里我们一般规定库函数中的头文件用<>表示,自定义的函数用""表示。

做到这一步就是如下图所示:

这个时候我们依然还是没有实现代码的隐藏呀?别急!精彩继续!

3.点击项目》属性》配置属性》常规》配置属性》默认是应用程序(.exe),这里要把应用程序改成静态库(.lib)》点击应用》点击确定

4.完成以后,我们调试运行,就会出现下列警告,例如:

表明在D:\code\university\test01\Debug路径下生成一个.lib文件,我们顺着路径找到我们的.lib文件,例如:

这个时候我们用试着打开这个文件,用记事本打开就会发现是一堆乱码,这样大家都看不懂就实现了代码的隐藏,例如:

这里我们用别的编译器打开,会显示无权限无法打开。这样我们就实现了代码的隐藏,到这里还没有结束。

5.我们把代码隐藏了,又如何卖给公司呢?这时候我们将写好的封装函数复制,例如:

这里我假设把它们卖给test_23_4_16这个公司,我们就将生成的.lib放在test_23_4_16这个文件中,以及这个函数的头文件.h也放在里面(头文件中就显示了函数的返回类型以及参数类型,别人猜不出函数代码,因此头文件可以一起卖出,但是这里千万不能把.c文件放进去,不然刚才做的一切都白费了,别人就能打开你的.c文件看到其中内容),例如:

然后打开test_23_4_16这个项目,把这两个文件添加到对应的文件下:

接下来调试运行,会显示执行不了

6.到了这里不要惊慌,这里我们需要导入静态库。

#pragma comment(lib,"Add.lib")

#pragma是预处理

comment是静态库

导入lib文件类型,名字是"Add.lib"的lib文件。

例如:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"Add.h"
#pragma comment(lib,"Add.lib")
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret=test(a, b);
	printf("%d", ret);
	return 0;
}

这样我们就彻底完成对一个代码的隐藏与卖出了。

以上就是vs中scanf报错的解决办法,希望大家喜欢,请继续关注程序员之家。

相关推荐:

vs2022怎么修改字符集? VisualStudio2022修改默认字符集的教程

相关文章

最新评论

?


http://www.vxiaotou.com