C語(yǔ)言中scanf與scnaf_s函數(shù)詳解
scanf_s
scanf_s()函數(shù)是Microsoft公司VS開(kāi)發(fā)工具提供的一個(gè)功能相同的安全標(biāo)準(zhǔn)輸入函數(shù),從vc++2005開(kāi)始,VS系統(tǒng)提供了scanf_s()。在調(diào)用該函數(shù)時(shí),可以提供一個(gè)數(shù)字以表明最多讀取多少位字符。
MSDN上scanf_s的簡(jiǎn)單模型:int scanf_s( const char *format [, argument]...);
一般我們常用的格式:scanf_s(輸入格式,輸入流 [,輸入變量的大小(單位:字節(jié))])
返回值:int類型(正常讀取返回1;讀取異常返回0)
使用scanf_s
一個(gè)字符輸入
int main() { char n = 0; scanf_s("%c", &n, sizeof(n)); printf("%c\n", n); return 0; }
一個(gè)整型輸入
int main() { int n = 0; scanf_s("%d", &n, sizeof(n)); printf("%d\n", n); return 0; }
多個(gè)整形輸入
int main() { int n = 0; int m = 0; scanf_s("%d%d", &n, &m, sizeof(n), sizeof(m)); printf("n = %d,m = %d\n", n, m); return 0; }
注意:在scanf_s中多個(gè)輸入的格式問(wèn)題
一個(gè)字符數(shù)組輸入
這里用%s輸入一個(gè)字符數(shù)組時(shí),最后的‘\0’是需要占1個(gè)字節(jié)的空間的;而當(dāng)輸入的長(zhǎng)度超過(guò)了數(shù)組的長(zhǎng)度時(shí),scanf_s的安全檢測(cè)就體現(xiàn)了,它直接返回0;printf也不會(huì)打印出來(lái),只有一個(gè)空行,沒(méi)有報(bào)錯(cuò)
int main() { char arr[5] = { 0 }; scanf_s("%s", arr, sizeof(arr)); printf("%s\n", arr); return 0; }
scanf
這是C語(yǔ)言標(biāo)準(zhǔn)庫(kù)里面的一個(gè)函數(shù),在VS底下使用這個(gè)會(huì)有警告,我們?cè)谖募_(kāi)頭加上:(#define _CRT_SECURE_NO_WARNINGS 1)或者 (#pragma warning(disable:4996)
就不會(huì)有警告了;
MSDN上scanf的簡(jiǎn)單模型:int scanf( const char *format [,argument]... );
一般我們常用的格式:scanf(輸入格式,輸入流 )
返回值:int類型(正常讀取返回讀取成功的元素個(gè)數(shù);讀取異常返回EOF)
使用scanf
一個(gè)整數(shù)輸入
多個(gè)整數(shù)輸入
字符數(shù)組輸入
可以看到scanf在輸入字符串的時(shí)候,并沒(méi)有安全檢測(cè),而是會(huì)直接用了數(shù)組后面的??臻g,然后造成棧溢出的問(wèn)題
總結(jié)
使用scanf_s函數(shù)雖然安全性比較高,但是可移植性差。scanf_s只能用在VS編譯器上,而其他的用不了它scanf函數(shù)雖然沒(méi)有scanf_s函數(shù)那么安全,但可移植性是比scanf_s強(qiáng)
到此這篇關(guān)于C語(yǔ)言中scanf與scnaf_s函數(shù)詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言scanf與scnaf_s內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽
本文給大家介紹的是使用C語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽功能的代碼,非常的實(shí)用,其主要作用是清除字符串開(kāi)頭結(jié)尾除空白,有需要的小伙伴可以參考下。2016-01-01C/C++獲取當(dāng)前時(shí)間的方法總結(jié)(最全)
這篇文章主要為大家整理了C/C++中獲取當(dāng)前時(shí)間的最全方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和借鑒價(jià)值,需要的可以了解一下2023-03-03C/C++讀寫(xiě)注冊(cè)表中二進(jìn)制數(shù)據(jù)(代碼示例)
這篇文章主要介紹了使用Windows API 函數(shù)中的RegOpenKeyEx()函數(shù)和RegSetValueEx()函數(shù)來(lái)實(shí)現(xiàn)對(duì)注冊(cè)表某項(xiàng)寫(xiě)入二進(jìn)制鍵值,需要的朋友可以參考下2020-02-02C語(yǔ)言編程C++編輯器及調(diào)試工具操作命令詳解
這篇文章主要介紹了C語(yǔ)言編程C++編輯調(diào)試工具操作命令詳解,本文章對(duì)C++調(diào)試工具的命令操作進(jìn)行了詳細(xì)的講解,有需要的朋友可以借鑒參考下2021-09-09C語(yǔ)言進(jìn)程程序替換的實(shí)現(xiàn)詳解
為什么要進(jìn)程替換?因?yàn)楦高M(jìn)程創(chuàng)建出來(lái)的子進(jìn)程和父進(jìn)程擁有相同的代碼段,所以,子進(jìn)程看到的代碼和父進(jìn)程是一樣的。當(dāng)我們想要讓子進(jìn)程執(zhí)行不同的程序時(shí)候,就需要讓子進(jìn)程調(diào)用進(jìn)程程序替換的接口,從而讓子進(jìn)程執(zhí)行不一樣的代碼2022-08-08C++中delete和delete[]的區(qū)別詳細(xì)介紹
一直對(duì)C++中的delete和delete[]的區(qū)別不甚了解,今天遇到了,上網(wǎng)查了一下,得出了結(jié)論,拿出來(lái)和大家分享一下2012-11-11使用remalloc的注意事項(xiàng)說(shuō)明(必看篇)
下面小編就為大家?guī)?lái)一篇使用remalloc的注意事項(xiàng)說(shuō)明(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03