VS中的scanf_s函數(shù)和scanf用法及說(shuō)明
VS中scanf_s函數(shù)和scanf
今天,在電腦上安裝了VS2017,因?yàn)橐郧耙恢笔褂玫氖荲C6.0和Dev_cpp,所以第一次使用VS有些笨拙。
今天建立的第一個(gè)C程序“hello world!”便于到的很大的難題
#include<stdio.h> void main() { printf("hello world!\n"); }
運(yùn)行無(wú)誤之后,在原先的代碼上添加了一些內(nèi)容如下:
#include<stdio.h> void main() { int a; printf("please input the number:\n"); scanf("%d",&a); printf("nihao:-------->%d\n", a); }
本來(lái)一個(gè)簡(jiǎn)單的程序,卻出現(xiàn)了異常:
于是將這段代碼放在Dev_cpp上運(yùn)行,結(jié)果運(yùn)行無(wú)誤,百思不得其解。
在網(wǎng)上搜了關(guān)于C4996錯(cuò)誤,找到了幾種解決辦法
1、根據(jù)提示,在文件頂部加入一行:#define _CRT_SECURE_NO_WARNINGS
運(yùn)行成功!
2、在文件頂部添加代碼:#pragma warning(disable:4996)
運(yùn)行成功!
3、真正原因在與vs中的SDL檢查。于是可以:右鍵單擊工程文件-->屬性--------> c/c++ ------>SDL checks ------------> no
按照錯(cuò)誤提示,可以將 scanf 替換為 scanf_s
#include<stdio.h> void main() { int a; printf("please input the number:\n"); scanf_s("%s",&a); printf("nihao:-------->%d\n", a); }
運(yùn)行成功
但是將這段代碼放進(jìn)Dev_cpp,卻出錯(cuò)了:
于是引發(fā)了一些關(guān)于scanf_s 的一些思考:
找了一些資料
ANSI C中沒(méi)有scanf_s(),只有scanf(),scanf()在讀取時(shí)不檢查邊界,所以可能會(huì)造成內(nèi)存泄露。所以VS中提供了scanf_s()
在最新的VS2017中也提供了scanf_s()在調(diào)用時(shí),必須提供一個(gè)數(shù)字以表明最多讀取多少位字符。
如果想繼續(xù)使用scanf這個(gè)不安全的函數(shù)可以使用宏命令來(lái)阻止錯(cuò)誤的產(chǎn)生
#define _CRT_SECURE_NO_DEPRECATE
請(qǐng)把宏命令放在最前面
或者編譯選項(xiàng)中加/D_CRT_SECURE_NO_DEPRECATE
或者在所有.c/.cpp文件前面添加#pragma warning(disable:4996)
scanf()
函數(shù)是標(biāo)準(zhǔn)C中提供的標(biāo)準(zhǔn)輸入函數(shù),用以用戶輸入數(shù)據(jù)scanf_s()
函數(shù)是Microsoft公司VS開(kāi)發(fā)工具提供的一個(gè)功能相同的安全標(biāo)準(zhǔn)輸入函數(shù),VS系統(tǒng)提供了scanf_s()。在調(diào)用該函數(shù)時(shí),必須提供一個(gè)數(shù)字以表明最多讀取多少位字符。
scanf()在讀取數(shù)據(jù)時(shí)不檢查邊界,所以可能會(huì)造成內(nèi)存訪問(wèn)越界:
//例如:分配了5字節(jié)的空間但是用戶輸入了10字節(jié),就會(huì)導(dǎo)致scanf()讀到10個(gè)字節(jié) char buf[5]={'\0'}; scanf("%s", buf); //如果輸入1234567890,則5以后的部分會(huì)被寫(xiě)到別的變量所在的空間上去,從而可能會(huì)導(dǎo)致程序運(yùn)行異常。 以上代碼如果用scanf_s()則可避免此問(wèn)題: char buf[5]={'\0'}; scanf_s("%s",buf,5); //最多讀取4個(gè)字符,因?yàn)閎uf[4]要放'\0' //如果輸入1234567890,則buf只會(huì)接受前4個(gè)字符 注: scanf_s最后一個(gè)參數(shù)n是接收緩沖區(qū)的大小(即buf的容量),表示最多讀取n-1個(gè)字符.
PS: 很多帶“_s”后綴的函數(shù)是為了讓原版函數(shù)更安全,傳入一個(gè)和參數(shù)有關(guān)的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系統(tǒng)。
vs中scanf報(bào)錯(cuò)的解決方法
在我們剛使用vs時(shí),在使用scanf函數(shù)時(shí)會(huì)遇到下面的這種情況,會(huì)出現(xiàn)這種情況的,發(fā)生這種情況的原因是VS認(rèn)為scanf這個(gè)函數(shù)不安全產(chǎn)生的,那么怎么解決呢,下面我簡(jiǎn)單說(shuō)幾種解決方法。
1.方法一:(我推薦使用這種方法)
首先找到你安裝VS的路徑然后按下面路徑找到E:\VS2019\Common7\IDE\VC\VCProjectItems 文件夾
在里面找到newc++file.cpp這個(gè)文件 ,然后將這個(gè)文件復(fù)制到桌面上用vs打開(kāi),然后將#define _CRT_SECURE_NO_WARNINGS 1 復(fù)制到里面,保存退出,最后將桌面上的文件轉(zhuǎn)移到原路徑下,并替換掉源文件,這樣就好了,并且在以后創(chuàng)建.c文件時(shí),系統(tǒng)都會(huì)默認(rèn)添加這行代碼在你的.c文件里,以后就不會(huì)出現(xiàn)問(wèn)題了
2.方法二
找到你創(chuàng)建的項(xiàng)目,右擊找到屬性,找到c/c±---->常規(guī)---->SDL檢查,將 是改為否 最后點(diǎn)擊確定就行了。
不夠這種方法在每次創(chuàng)建新項(xiàng)目是都要設(shè)置一下,比較麻煩,所以還是推薦使用方法一,設(shè)置一次后以后創(chuàng)建新文件都不用設(shè)置了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言使用setjmp和longjmp實(shí)現(xiàn)一個(gè)簡(jiǎn)單的協(xié)程
這篇文章主要為大家介紹了C語(yǔ)言使用setjmp和longjmp實(shí)現(xiàn)一個(gè)簡(jiǎn)單的協(xié)程過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12c++實(shí)現(xiàn)MD5算法實(shí)現(xiàn)代碼
用c++實(shí)現(xiàn)了md5算法。包含 md5.h 和md5.cpp 兩個(gè)文件。主要參考百度百科 “MD5” 原理,代碼中變量命名也是參考其中的公式,程序的使用說(shuō)明在md5.h 文件的末尾注釋中2013-11-11一文帶你搞懂C語(yǔ)言動(dòng)態(tài)內(nèi)存管理
動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。本文將通過(guò)幾個(gè)示例帶大家深入了解一下C語(yǔ)言的動(dòng)態(tài)內(nèi)存管理,需要的可以參考一下2022-11-11C++實(shí)現(xiàn)LeetCode(156.二叉樹(shù)的上下顛倒)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(156.二叉樹(shù)的上下顛倒),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07