VS2019中scanf函數(shù)莫名報(bào)錯(cuò)怎么辦 Visual Studio2019實(shí)用小操作介紹
在.c文件中添加宏定義取消錯(cuò)誤
在使用vs編譯器時(shí),我們使用scanf函數(shù),可能有些小伙伴會(huì)疑惑,為什么我的代碼沒(méi)有錯(cuò)誤,vs依然報(bào)錯(cuò)。
這里有兩種方式解決。
第一種方法解釋
scanf來(lái)源于c語(yǔ)言標(biāo)準(zhǔn)庫(kù),vs2019中scanf函數(shù)被認(rèn)為是不安全的,因?yàn)樗荒鼙WC輸入數(shù)據(jù)的長(zhǎng)度不會(huì)超過(guò)指定的緩沖區(qū)的大小,可能導(dǎo)致緩沖區(qū)溢出漏洞,為了解決這個(gè)問(wèn)題vs2019提供一組安全版本的輸入函數(shù)如scanf_s,它是基于c11和c++標(biāo)準(zhǔn)引入的一組安全輸入函數(shù),不屬于c語(yǔ)言標(biāo)準(zhǔn)庫(kù)的一部分但是是屬于可選的拓展庫(kù),stdio.h是c語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的一個(gè)頭文件,scanf_s也被支持在此頭文件中使用。scanf是C語(yǔ)言提供的,scanf_s是VS提供的,這里我用的是vs編譯器,為了保證兼容性,這里可以使用scanf_s,但是如果你們使用的是別的編譯器,例如gcc,vc就可以使用scanf.
但是假如一個(gè)程序里面大量使用scanf函數(shù)或者以后每次編程使用,我們都要一個(gè)一個(gè)將scanf改成scanf_s是不是過(guò)于麻煩了呢?這里我們還沒(méi)有總結(jié)到宏定義,在這里就直接告訴大家一個(gè)小技巧。
第二種方法—使用宏定義的方法
例如:
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", a);
printf("%d\n", a);
return 0;
把這串字符復(fù)制粘貼在代碼的開(kāi)頭,加上:''#define _CRT_SECURE_NO_WARNINGS 6''。(一定要放在第一行!?。。?define是宏定義,這里的6是編譯器隨機(jī)給的一個(gè)數(shù),這里把他改成任意數(shù)字都是可以的??赡苣銈兊木幾g器上還會(huì)報(bào)一個(gè)scanf返回值被忽略的警告,這個(gè)是沒(méi)關(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'',有沒(méi)有更方便的辦法?我一創(chuàng)建項(xiàng)目就能自動(dòng)添加這行代碼呢?答案當(dāng)然是能的!(不然我也不會(huì)在這里說(shuō),這不是打自己的臉嗎。)
步驟:
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.接下來(lái)我們點(diǎn)擊對(duì)應(yīng)的newc++ file.cpp文件,右擊鼠標(biāo),點(diǎn)擊選項(xiàng)》打開(kāi)路徑(o),然后跳到newc++ file.cpp這個(gè)文件的位置。例如:

千萬(wàn)不要把這個(gè)路徑關(guān)閉,不然后面可能找不到了。
3.然后我們來(lái)到桌面,點(diǎn)擊newc++ file.cpp,右擊鼠標(biāo),選項(xiàng)》打開(kāi)方式(H),選擇一種打開(kāi)方式,可以是記事本...,這里我就用vs2019打開(kāi),打開(kāi)之后是下面這樣空空如也的:

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

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

粘貼替換掉原來(lái)的newc++ file.cpp文件,例如:

粘貼完成后,如果不放心,你可以點(diǎn)擊newc++ file.cpp文件,右擊鼠標(biāo),選擇》打開(kāi)方式(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''.
代碼的隱藏
這里我們可能聽(tīng)說(shuō)過(guò)程序員將自己創(chuàng)作的優(yōu)質(zhì)代碼賣(mài)出,例如有一名程序員寫(xiě)了一個(gè)比較有價(jià)值的代碼,他想把這個(gè)代碼賣(mài)個(gè)公司,自己維護(hù),然后每年收費(fèi),那這是怎么實(shí)現(xiàn)的呢?這里我給大家介紹C/C++的一種辦法,通過(guò)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à)值,因此他想要把這段代碼隱藏起來(lái),賣(mài)給另外一個(gè)公司。那么怎么在vs中實(shí)現(xiàn)代碼隱藏呢?
1. 首先把代碼的定義(也就是這段代碼的實(shí)現(xiàn))放入另一個(gè).c文件(不和main函數(shù)放在一個(gè).c文件中)。例如:

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


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

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

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

這里我們一般規(guī)定庫(kù)函數(shù)中的頭文件用<>表示,自定義的函數(shù)用""表示。
做到這一步就是如下圖所示:

這個(gè)時(shí)候我們依然還是沒(méi)有實(shí)現(xiàn)代碼的隱藏呀?別急!精彩繼續(xù)!
3.點(diǎn)擊項(xiàng)目》屬性》配置屬性》常規(guī)》配置屬性》默認(rèn)是應(yīng)用程序(.exe),這里要把應(yīng)用程序改成靜態(tài)庫(kù)(.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í)候我們用試著打開(kāi)這個(gè)文件,用記事本打開(kāi)就會(huì)發(fā)現(xiàn)是一堆亂碼,這樣大家都看不懂就實(shí)現(xiàn)了代碼的隱藏,例如:

這里我們用別的編譯器打開(kāi),會(huì)顯示無(wú)權(quán)限無(wú)法打開(kāi)。這樣我們就實(shí)現(xiàn)了代碼的隱藏,到這里還沒(méi)有結(jié)束。
5.我們把代碼隱藏了,又如何賣(mài)給公司呢?這時(shí)候我們將寫(xiě)好的封裝函數(shù)復(fù)制,例如:

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

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


接下來(lái)調(diào)試運(yùn)行,會(huì)顯示執(zhí)行不了
6.到了這里不要驚慌,這里我們需要導(dǎo)入靜態(tài)庫(kù)。
#pragma comment(lib,"Add.lib")
#pragma是預(yù)處理
comment是靜態(tài)庫(kù)
導(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;
}這樣我們就徹底完成對(duì)一個(gè)代碼的隱藏與賣(mài)出了。
以上就是vs中scanf報(bào)錯(cuò)的解決辦法,希望大家喜歡,請(qǐng)繼續(xù)關(guān)注腳本之家。
相關(guān)推薦:
vs2022怎么修改字符集? VisualStudio2022修改默認(rèn)字符集的教程
相關(guān)文章

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












