欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

VS2019中scanf函數(shù)莫名報(bào)錯(cuò)怎么辦 Visual Studio2019實(shí)用小操作介紹

  發(fā)布時(shí)間:2024-01-22 09:19:17   作者:佚名   我要評論
相信很多小伙伴在第一次使用scanf函數(shù)時(shí)大概率會(huì)遇到系統(tǒng)報(bào)錯(cuò)的問題,提示:scanf這個(gè)函數(shù)或者變量可能不安全 ,考慮使用scanf_s替換,下面我們就來看看詳細(xì)的解決辦法

在.c文件中添加宏定義取消錯(cuò)誤

在使用vs編譯器時(shí),我們使用scanf函數(shù),可能有些小伙伴會(huì)疑惑,為什么我的代碼沒有錯(cuò)誤,vs依然報(bào)錯(cuò)。

這里有兩種方式解決。

第一種方法解釋

scanf來源于c語言標(biāo)準(zhǔn)庫,vs2019中scanf函數(shù)被認(rèn)為是不安全的,因?yàn)樗荒鼙WC輸入數(shù)據(jù)的長度不會(huì)超過指定的緩沖區(qū)的大小,可能導(dǎo)致緩沖區(qū)溢出漏洞,為了解決這個(gè)問題vs2019提供一組安全版本的輸入函數(shù)如scanf_s,它是基于c11和c++標(biāo)準(zhǔn)引入的一組安全輸入函數(shù),不屬于c語言標(biāo)準(zhǔn)庫的一部分但是是屬于可選的拓展庫,stdio.h是c語言標(biāo)準(zhǔn)庫中的一個(gè)頭文件,scanf_s也被支持在此頭文件中使用。scanf是C語言提供的,scanf_s是VS提供的,這里我用的是vs編譯器,為了保證兼容性,這里可以使用scanf_s,但是如果你們使用的是別的編譯器,例如gcc,vc就可以使用scanf.

但是假如一個(gè)程序里面大量使用scanf函數(shù)或者以后每次編程使用,我們都要一個(gè)一個(gè)將scanf改成scanf_s是不是過于麻煩了呢?這里我們還沒有總結(jié)到宏定義,在這里就直接告訴大家一個(gè)小技巧。

第二種方法—使用宏定義的方法

例如:

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

把這串字符復(fù)制粘貼在代碼的開頭,加上:''#define _CRT_SECURE_NO_WARNINGS 6''。(一定要放在第一行!?。。?define是宏定義,這里的6是編譯器隨機(jī)給的一個(gè)數(shù),這里把他改成任意數(shù)字都是可以的。可能你們的編譯器上還會(huì)報(bào)一個(gè)scanf返回值被忽略的警告,這個(gè)是沒關(guān)系,代碼依然可以運(yùn)行。

例如:

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

那么代碼就能在vs中正常運(yùn)行。

可是后面如果我每次使用scanf、strcpy、strcat...這些函數(shù)時(shí),vs都會(huì)提示不安全,那我每次都要在.c文件中都加入''#define _CRT_SECURE_NO_WARNINGS 6'',有沒有更方便的辦法?我一創(chuàng)建項(xiàng)目就能自動(dòng)添加這行代碼呢?答案當(dāng)然是能的?。ú蝗晃乙膊粫?huì)在這里說,這不是打自己的臉嗎。)

步驟:

1.這里我們先找到newc++file.cpp這個(gè)文件,在這個(gè)文件中加入''#define _CRT_SECURE_NO_WARNINGS 1'',以后新建的文件中都會(huì)自動(dòng)加上''#define _CRT_SECURE_NO_WARNINGS 1''。(可以使用之前我分享的工具Everything進(jìn)行查找文件newc++file.cpp)(Everything等工具講解鏈接:http://t.csdn.cn/EJ62i)

例如:

2.接下來我們點(diǎn)擊對應(yīng)的newc++ file.cpp文件,右擊鼠標(biāo),點(diǎn)擊選項(xiàng)》打開路徑(o),然后跳到newc++ file.cpp這個(gè)文件的位置。例如:

千萬不要把這個(gè)路徑關(guān)閉,不然后面可能找不到了。

3.然后我們來到桌面,點(diǎn)擊newc++ file.cpp,右擊鼠標(biāo),選項(xiàng)》打開方式(H),選擇一種打開方式,可以是記事本...,這里我就用vs2019打開,打開之后是下面這樣空空如也的:

這個(gè)時(shí)候,我們把''#define _CRT_SECURE_NO_WARNINGS 1'',Ctrl+S保存就可以了。例如:

這個(gè)時(shí)候關(guān)閉vs,復(fù)制一下我們電腦桌面的newc++ file.cpp文件,回到我們的路徑下面

粘貼替換掉原來的newc++ file.cpp文件,例如:

粘貼完成后,如果不放心,你可以點(diǎn)擊newc++ file.cpp文件,右擊鼠標(biāo),選擇》打開方式(o)進(jìn)行查看,這個(gè)時(shí)侯就會(huì)出現(xiàn)''#define _CRT_SECURE_NO_WARNINGS 1'',例如:

這樣以后每次新建項(xiàng)目都會(huì)自動(dòng)加入''#define _CRT_SECURE_NO_WARNINGS 1''.

代碼的隱藏

這里我們可能聽說過程序員將自己創(chuàng)作的優(yōu)質(zhì)代碼賣出,例如有一名程序員寫了一個(gè)比較有價(jià)值的代碼,他想把這個(gè)代碼賣個(gè)公司,自己維護(hù),然后每年收費(fèi),那這是怎么實(shí)現(xiàn)的呢?這里我給大家介紹C/C++的一種辦法,通過vs2019實(shí)現(xiàn)代碼的隱藏。

以下列這段代碼為例:實(shí)現(xiàn)兩數(shù)的加法運(yùn)算

#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;
}

現(xiàn)在假設(shè)程序員設(shè)計(jì)的就是這個(gè)Add程序,這個(gè)程序很有價(jià)值,因此他想要把這段代碼隱藏起來,賣給另外一個(gè)公司。那么怎么在vs中實(shí)現(xiàn)代碼隱藏呢?

1. 首先把代碼的定義(也就是這段代碼的實(shí)現(xiàn))放入另一個(gè).c文件(不和main函數(shù)放在一個(gè).c文件中)。例如:

2.在使用庫函數(shù)時(shí),我們知道要使用庫函數(shù),必須要引用包含這段庫函數(shù)的頭文件。這里我們自定義一個(gè)函數(shù)也是如此,需要引用對應(yīng)源文件的頭文件。因此我們需要?jiǎng)?chuàng)建一個(gè)頭文件,將我們自定義的函數(shù)包括進(jìn)去。例如:

完成后點(diǎn)擊添加。這樣就是下列圖示:

這樣Add.h與Add.c就成為一個(gè)模塊(加法模塊)。接下來,我們還要在頭文件中添加我們對應(yīng)創(chuàng)立的源文件(.c)的聲明,例如:

這里出現(xiàn)的#pragma once就是創(chuàng)建頭文件的意思,這里把它刪掉也可以,沒有影響。做到這里,我們把源文件(.c)和頭文件(.c)都準(zhǔn)備好了,那么接下來就是在主函數(shù)中引用了。例如:

這里我們一般規(guī)定庫函數(shù)中的頭文件用<>表示,自定義的函數(shù)用""表示。

做到這一步就是如下圖所示:

這個(gè)時(shí)候我們依然還是沒有實(shí)現(xiàn)代碼的隱藏呀?別急!精彩繼續(xù)!

3.點(diǎn)擊項(xiàng)目》屬性》配置屬性》常規(guī)》配置屬性》默認(rèn)是應(yīng)用程序(.exe),這里要把應(yīng)用程序改成靜態(tài)庫(.lib)》點(diǎn)擊應(yīng)用》點(diǎn)擊確定

4.完成以后,我們調(diào)試運(yùn)行,就會(huì)出現(xiàn)下列警告,例如:

表明在D:\code\university\test01\Debug路徑下生成一個(gè).lib文件,我們順著路徑找到我們的.lib文件,例如:

這個(gè)時(shí)候我們用試著打開這個(gè)文件,用記事本打開就會(huì)發(fā)現(xiàn)是一堆亂碼,這樣大家都看不懂就實(shí)現(xiàn)了代碼的隱藏,例如:

這里我們用別的編譯器打開,會(huì)顯示無權(quán)限無法打開。這樣我們就實(shí)現(xiàn)了代碼的隱藏,到這里還沒有結(jié)束。

5.我們把代碼隱藏了,又如何賣給公司呢?這時(shí)候我們將寫好的封裝函數(shù)復(fù)制,例如:

這里我假設(shè)把它們賣給test_23_4_16這個(gè)公司,我們就將生成的.lib放在test_23_4_16這個(gè)文件中,以及這個(gè)函數(shù)的頭文件.h也放在里面(頭文件中就顯示了函數(shù)的返回類型以及參數(shù)類型,別人猜不出函數(shù)代碼,因此頭文件可以一起賣出,但是這里千萬不能把.c文件放進(jìn)去,不然剛才做的一切都白費(fèi)了,別人就能打開你的.c文件看到其中內(nèi)容),例如:

然后打開test_23_4_16這個(gè)項(xiàng)目,把這兩個(gè)文件添加到對應(yīng)的文件下:

接下來調(diào)試運(yùn)行,會(huì)顯示執(zhí)行不了

6.到了這里不要驚慌,這里我們需要導(dǎo)入靜態(tài)庫。

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

#pragma是預(yù)處理

comment是靜態(tài)庫

導(dǎo)入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;
}

這樣我們就徹底完成對一個(gè)代碼的隱藏與賣出了。

以上就是vs中scanf報(bào)錯(cuò)的解決辦法,希望大家喜歡,請繼續(xù)關(guān)注腳本之家。

相關(guān)推薦:

vs2022怎么修改字符集? VisualStudio2022修改默認(rèn)字符集的教程

相關(guān)文章

最新評論