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

在.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)文章
VSCode怎么關(guān)閉聚焦種子? VisualStudioCode聚焦種子設(shè)置方法
VSCode怎么關(guān)閉聚焦種子?這個(gè)功能不常用,很多朋友找不到該功能所在位置,下面我們就來看看VisualStudioCode聚焦種子設(shè)置方法2022-09-30VSCode怎么取消拖放拆分? VisualStudioCode拖放拆分的關(guān)閉方法
VSCode怎么取消拖放拆分?VSCode拖放總是拆分出一個(gè)新窗口,想要關(guān)閉這個(gè)功能,下面我們就來看看VisualStudioCode拖放拆分的關(guān)閉方法2022-09-30vscode怎么一鍵運(yùn)行? VisualStudioCode開啟合并運(yùn)行按鈕技巧
Visual Studio Code怎么開啟合并運(yùn)行按鈕?實(shí)現(xiàn)的功能就是,控制是否在運(yùn)行按鈕旁邊的下拉列表中顯示額外的操作,下面我們就來就來看看VisualStudioCode開啟合并運(yùn)行按鈕的2022-10-08VSCode怎么隱藏發(fā)行說明? VisualStudioCode關(guān)閉顯示發(fā)行說明的技巧
VSCode怎么隱藏發(fā)行說明?VSCode代碼是可以顯示發(fā)行說明的,當(dāng)然也可以隱藏,該怎么操作呢?下面我們就來看看VisualStudioCode關(guān)閉顯示發(fā)行說明的技巧2022-10-08vscode空窗怎么關(guān)閉? VisualStudioCode關(guān)閉空窗的技巧
vscode空窗怎么關(guān)閉?控制在VS代碼中默認(rèn)情況下是否信任空窗口,如果不想有空窗,開啟這個(gè)功能即可,下面我們就來看看VisualStudioCode關(guān)閉空窗的技巧2022-10-08vscode怎么關(guān)閉遙測? Visual Studio Code不啟用遙測的技巧
Visual Studio Code怎么關(guān)閉啟用遙測?開啟遙測就可以收集診斷數(shù)據(jù),如果想要關(guān)閉,該怎么關(guān)閉呢?下面我們就來看看詳細(xì)的教程2022-10-13微軟發(fā)布Visual Studio 2022 17.3 支持.NET MAUI
VisualStudio2022 17.3 發(fā)布,Visual Studio 2022 GA 版包括.NET MAUI、Microsoft Teams 應(yīng)用程序支持、C++ 改進(jìn)等,詳細(xì)請看細(xì)文介紹2022-10-14VSCode懸停文檔怎么關(guān)閉? Visual Studio Code關(guān)閉懸停文檔的技巧
VSCode懸停文檔怎么關(guān)閉?在CSS懸停中顯示標(biāo)簽和屬性文檔,不想使用這個(gè)功能,該怎么操作呢?下面我們就來看看Visual Studio Code關(guān)閉懸停文檔的技巧2022-11-07VSCode重復(fù)屬性怎么提醒? VisualStudioCode設(shè)置重復(fù)屬性錯(cuò)誤的技巧
VSCode重復(fù)屬性怎么提醒?VSCode中是可以使用重復(fù)的樣式定義的,如果不想使用,可以設(shè)置提醒錯(cuò)誤,下面我們就來看看詳細(xì)的教程2022-11-14VisualStudio 2022 17.4發(fā)布 首次支持回滾到舊版本
Visual Studio 2022 17.4 現(xiàn)已全面發(fā)布,這是第一個(gè)支持 Arm64 的 GA 版本,此外,該版本還包含其他功能,包括支持 .NET 7引入了版本回滾功能等2022-11-14