VS2019中scanf函数莫名报错怎么办 Visual Studio2019实用小操作介绍
脚本之家
在.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报错的解决办法,希望大家喜欢,请继续关注脚本之家。
相关推荐: