1. 程式人生 > >VS提示scanf不安全問題

VS提示scanf不安全問題

 

#include<stdio.h>

#include<stdlib.h>

int main()

{

int m;

int n;

int i;

printf("請輸入m的值\n");

scanf("%d", &m);

printf("請輸入n的值\n");

scanf("%d", &n);

printf("m=%d,n=%d", m, n);

printf("兩個數值進行交換\n");

i = m;

m = n;

n = i;

printf("m=%d,n=%d\n", m, n);

system("pasue");

return 0;

}

錯誤 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\程式

\交換兩個整型變數的數值\交換兩個整型變數的數值\.cpp 9 1 交換兩個整型變數的數值

相信很多人在用vs編寫程式的時候都會遇到我發的這種問題,我在學習C語言的時候老師明確的告訴我說取值的語句就是scanf語句,為什麼我現在寫出來它報錯了,這麼簡單的語句我肯定不會寫錯,那到底是哪出了問題呢?它為什麼會提示我讓我寫scanf-s呢?

首先我先來說一下scanfscanf-s的區別

scanf()函式是標準C中提供的標準輸入函式,用以使用者輸入資料

scanf_s()函式是Microsoft公司VS開發工具提供的一個功能相同的安全標準輸入函式,從vc++2005開始,VS系統提供了scanf_s

()。在呼叫該函式時,必須提供一個數字以表明最多讀取多少位字元。

scanf()在讀取資料時不檢查邊界,所以可能會造成記憶體訪問越界:

1

2

3

4

//例如:分配了5位元組的空間但是使用者輸入了10位元組,就會導致scanf()讀到10個位元組

charbuf[5]={'\0'};

scanf("%s", buf);

//如果輸入1234567890,則5以後的部分會被寫到別的變數所在的空間上去,從而可能會導致程式執行異常。

以上程式碼如果用scanf_s()則可避免此問題:

1

2

3

charbuf[5]={'\0'};

scanf_s("%s",buf,5); //最多讀取4個字元,因為buf[4]要放'\0' 

//如果輸入1234567890,則buf只會接受前4個字元

所以來說這不是自己寫程式碼的問題,而是vs這個編譯器出了問題,於是有人就說好吧,那以後我就記住了不會再寫scanf了全都寫成scanf-s這樣不就行了嗎,首先,我感覺這真的是增加了一個小白的工作量,在編寫程式碼的時候不僅時時記著改成scanf-s而且在呼叫這個函式的時候又多了一個變數,在呼叫的時候還需要給這個變數一個值。並且還有一個更加嚴重的問題雖然現在還影響不到你但是終究會有影響,那就是,這個scanf-s是微軟公司出的vs所提供的,別的編譯軟體並沒有這個東西,所以當你將所有的scanf全都改了之後,在其他平臺就會出現新的錯誤,在你工作的時候,大家肯定有人會用其他的編譯器,所以在一直平臺的時候就會大大降低程式碼的通用性。

  那我今天就給大家說兩個我自己所知道的辦法:

 第一個:

 

點開vs上邊的專案,然後看最下邊有一個你的專案的屬性

 

點屬性你就會出來這個專案的屬性頁

 

進去找配置屬性----C/C++-----程式碼生成,找到其中一個安全檢查的選項,你發現後邊的選項中是啟用安全檢查,這時候你點一下後邊

 

將後邊的安全檢查改成禁用這時候你再去執行的你程式碼。

 

這時候雖然下邊會有警告,但是完全不影響你程式碼的運行了已經。

第一個的方法,雖然每個程式只用更改一次,但是當你關了這個專案再開另一個專案的時候你會發現,它的安全檢查又開了,所以你需要再更改一次,第二種方法我給大家介紹一個一次性操作的方法。

第二種方法:

   這時候你看你最初的時候提出的錯誤

1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\程式\交換兩個整型變數的數值\交換兩個整型變數的數值\.cpp 9 1 交換兩個整型變數的數值

_CRT_SECURE_NO_WARNINGS 你會發現有一個這個東西。那咱們就用這個東西來改變現在的問題。

找到你的VS安裝目錄

 


VC-vcprojectitems-newc++file

然後把他用Notepad++開啟,如果用其他的應用開啟的話,例如vs、記事本等等開啟之後是不能將他更改的,用notepad++開啟之後 #define _CRT_SECURE_NO_WARNINGS 1在文件中加入一句這個話,然後儲存,有的電腦會要求你使用管理者許可權,這時候你通過就可以。

 

再之後你建立的所有專案開始就會有這一句話,你在這句話下邊再正常編寫你的程式碼就可以了。之後就不會再出現錯誤了。

  這是我所知道的兩種解決VS提示安全問題的方法,僅供參考。

相關推薦

VS提示scanf安全問題

  #include<stdio.h> #include<stdlib.h> int main() { int m; int n; int i; printf("請輸入m的值\n"); scanf("%d", &m); printf("請

chrome NET::ERR_CERT_AUTHORITY_INVALID提示網址安全無法訪問

無 用chrome測試 1. 問題描述今天用Apache搭建好PC端服務器後,用Chrome測試,打開http://www.baidu.com/時出現了如下的錯誤: 2. 錯誤原因經試驗發現,對於firefox和IE不會出現上述問題。或者會出現安全警告,但是可以選擇信任而繼續訪問頁面。但是對於chro

在VS2013 使用C語言庫函式,出現出現錯誤,提示使用安全函式use _CRT_SECURE_NO_WARNINGS

在VS 2013 中編譯 C 語言專案,如果使用了 scanf 函式,編譯時便會提示如下錯誤: error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disab

vs2015 scanf 安全 使用 scanf_s 解決方法

VS的SDL選項是編譯器在原始碼層次盡最大可能減少安全漏洞的數量和嚴重性,比如scanf這樣的函式在目前看來就是不安全的,可能會溢位導致崩潰,開啟這個選項,那麼這類函式將視為錯誤,以前的版本預設是關閉SDL選項的,在學習階段關閉SDL會少很多限制 在建立專

Asp.net 安全端口 解決chrome瀏覽器訪問時提示:ERR_UNSAFE_PORT

asp.net itl second command con setting log kit conda https://blog.bbzhh.com/index.php/archives/136.html 想在vps做個測試,看看是否25端口屏蔽是否生效,於是起了一

https網頁加載http資源提示加載安全腳本

兩個 技巧 嵌入 安全腳本 asc 排除 推廣 onload div  https是當下的網站的主流趨勢,甚至像蘋果這樣的大公司,則完全要求用戶必須使用https地址。  然而對於以前http鏈接來說,我們往往就存在一個兼容性問題,因為你不可能一下就全部切換過去,應該在很長

火狐瀏覽器訪問HTTPS連接,提示連接安全

布爾 https 重啟 about roo 選項 log .com com 1.在地址欄鍵入"about:config" 點擊“我了解此風險” 2.在下方頁面新建布爾值 3.輸入首選項名稱為“security.enterprise_roots.enabled”並

使用正確的主機名訪問https,提示連接安全

image alt img mar 現象 test water src 問題 問題現象:用申請的域名訪問提示證書錯誤(訪問者電腦上不了外網)。解決辦法:將頒發下來的交叉等證書內容復制追加到mail_test_cn.crt文件裏面,最後配置在nginx裏面。使用正確的主機名訪

Windows 10提示能訪問此共享資料夾,因為你組織的安全策略阻止未經身份驗證的來賓訪問

本文為你提供Windows 10提示你不能訪問此共享資料夾,因為你組織的安全策略阻止未經身份驗證的來賓訪問的解決方法,如果使用Windows 10提示你不能訪問此共享資料夾,因為你組織的安全策略阻止未經身份驗證的來賓訪問。這些策略可幫助保護你的電腦免受網路上不安全裝置或惡意裝置的威脅。那麼看完本文你就可以試試

C++字串轉整數詳解(安全vs安全)

問題:將str轉為整數 input:“1234” output:1234 1,一種不安全的方式 #include<iostream> ... int result = std::atoi(str.c_str()); 2,一種安全的方式

瀏覽器提示網站連結安全,證書過期了

本文轉自公眾號《差評君》 我們有時候在訪問一些網站的時候可能會遇到平時是安全的連結但是突然就報連結不安全。這時候很有可能就是:證書過期了。 這個證書。。。準確地說,是數字證書。 幹嘛用的呢? 自我證明:證明你上的淘寶網真的是淘寶網。 你可能會好奇,淘寶網的域名

消除VS中對使用安全函式的error

方法一:.在預編譯標頭檔案stdafx.h裡(注意:一定要在沒有include任何標頭檔案之前)定義下面的巨集:   #define _CRT_SECURE_NO_WARNINGS 方法二:更改預處理定義:   專案->屬性->配置屬性->C/C++ -

http變為https後各大瀏覽器仍然提示安全解決辦法

現在把http變更為https,已經是大勢所趨,就比如沒有SSL證書,你一個裸奔http域名訪問谷歌瀏覽器,谷歌瀏覽器首先就是禁止訪問網站,跳出來一條紅色警告,說你訪問的網站不安全,其他瀏覽器也不例外,火狐瀏覽器?等等,絕大大部分瀏覽器都會提醒訪問網站不安全。訪

ssh用私鑰登入遠端伺服器時提示私鑰安全問題解決

ssh用私鑰ding_test.pem登陸伺服器11.10.37.54 [email protected]:~# ssh -i ding_test.pem [email pro

fiddler在使用過程中導致firefox提示安全的連結而無法上網

在使用firefox時,由於新裝了好幾個外掛,然後開啟fiddler發現百度首頁無法打開了,然後嘗試了其他幾個網站均出現了下圖中的錯誤,筆者用其他瀏覽器均能正常上網,根據提示問題出在證書上。於是挨

win10提示“因為檔案共享安全,所以你能連線到檔案共享”如何處理

因為檔案共享不安全,所以你不能連線到檔案共享。此共享需要過時的SMB1協議,而此協議是不安全的,可能會使你的系統遭受攻擊。 你的系統需要SMB2或更高版本。關於如何解決此問題的資訊”。其實,該問題是win10 1709 版本不相容導致的。具體解決方法如下:

ConcurrentDictionary線程安全

數據庫 文章 知識點 項目 讀者 話題本節的內容算是非常老的一個知識點,在.NET4.0中就已經出現,並且在園中已有園友作出了一定分析,為何我又拿出來講呢?理由如下:(1)沒用到過,算是自己的一次切身學習。(2)對比一下園友所述,我想我是否能講的更加詳盡呢?挑戰一下。(3)是否能夠讓讀者理

500G硬盤提示位置可用,無法訪問H:磁盤結構損壞且無法讀取的數據恢復方法

數據恢復方法 位置不可用 磁盤結構損壞且無法讀取 無法訪問h 500G硬盤提示位置不可用,無法訪問H:\磁盤結構損壞且無法讀取的數據恢復方法,雙擊這個盤會提示下圖,根本打不開, 由於裏面還有文件,不能格式化這個盤。所以需要做數據恢復 ,具體操作看下面1.下載極光數據恢復軟件,然後打開這個軟件,

sql 真的很安全

安全 soft -h right 數據 mysql 利用 ews erp 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)[+] 轉載請註明出處:http://blog.csdn.NET/zgyulongfei/article/detail

postgress數據庫 出現大寫字母 字段名但是提示存在

語句 col 存在 sof font ati 字段 rom 字母 select BSK001 from dbdata 報錯: column "bsk001" of relation "dbdata" does not exist. 原因是數據庫中字段名為BSK001,而