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類(lèi)型(正常讀取返回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類(lèi)型(正常讀取返回讀取成功的元素個(gè)數(shù);讀取異常返回EOF)
使用scanf
一個(gè)整數(shù)輸入

多個(gè)整數(shù)輸入

字符數(shù)組輸入
可以看到scanf在輸入字符串的時(shí)候,并沒(méi)有安全檢測(cè),而是會(huì)直接用了數(shù)組后面的棧空間,然后造成棧溢出的問(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++ 17轉(zhuǎn)發(fā)一個(gè)函數(shù)調(diào)用的完美實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于C++ 17如何轉(zhuǎn)發(fā)一個(gè)函數(shù)調(diào)用的完美實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++17具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
C++中高性能內(nèi)存池的實(shí)現(xiàn)詳解
在 C/C++ 中,內(nèi)存管理是一個(gè)非常棘手的問(wèn)題,我們?cè)诰帉?xiě)一個(gè)程序的時(shí)候幾乎不可避免的要遇到內(nèi)存的分配邏輯。本文將通過(guò)C++實(shí)現(xiàn)高性能內(nèi)存池,感興趣的可以了解一下2022-10-10
使用map實(shí)現(xiàn)單詞轉(zhuǎn)換的實(shí)例分析
本篇文章是對(duì)使用map實(shí)現(xiàn)單詞轉(zhuǎn)換的代碼實(shí)例進(jìn)行了纖細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語(yǔ)言實(shí)現(xiàn)酒店管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C中的open(),?write(),?close(),?fopen()詳解
本文主要介紹了C語(yǔ)言中的open(),?write(),?close(),?fopen()等文件操作函數(shù),open()函數(shù)用于打開(kāi)文件,write()函數(shù)用于寫(xiě)入數(shù)據(jù),close()函數(shù)用于關(guān)閉已打開(kāi)的文件描述符2024-10-10
C語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)井字棋及電腦落子優(yōu)化示例詳解
以前上課經(jīng)常和同桌玩起井字棋,那么我們就當(dāng)我們回憶童年,現(xiàn)在也用C語(yǔ)言來(lái)實(shí)現(xiàn)井字棋,本次代碼相對(duì)于初階的井字棋,在電腦下棋代碼部分做了優(yōu)化,使得電腦更加具有威脅2021-11-11

