C語(yǔ)言中scanf與scanf_s函數(shù)的使用詳解
1.scanf_s(是vs提供的函數(shù))
a.代碼1
int main()
{
char a = 0;
//scanf_s("%c", &a, 1);
scanf_s("%c", &a, sizeof(a));
return 0;
}

scanf_s有三個(gè)參數(shù),最后一個(gè)是變量a所占據(jù)空間的大?。▎挝粸樽止?jié)),這里可以寫1,也可以寫sizeof(a)。如果a為整型的話,第三個(gè)參數(shù)就為4,或者sizeof(a)。
b.代碼2
int main()
{
char a = 0, b = 0;
scanf_s("%c %c", &a, 1, &b, 1);
printf("%c %c", a, b);
return 0;
}

可不要寫成 scanf_s("%c%c",&a,&b,1,1); 這樣會(huì)出錯(cuò)的
c.代碼3
int main()
{
char arr1[5] = { 0 };
scanf_s("%s", arr1, sizeof(arr1));
printf("%s", arr1);
return 0;
}

注意:輸入字符的個(gè)數(shù)時(shí),一定是比數(shù)組的空間個(gè)數(shù)小的,比如像上面的代碼只能輸入1-4個(gè)字符,而不是5個(gè),不然會(huì)出錯(cuò)的。(arr[4]裝的應(yīng)該是一個(gè)換行符)
d.安全性檢測(cè)
int main()
{
char arr1[5] = { 0 };
int c=scanf_s("%s", arr1, sizeof(arr1));
printf("%d\n", c);
printf("%s", arr1);
return 0;
}

如果輸入的字符個(gè)數(shù)>=數(shù)組空間 個(gè)數(shù),scanf_s的返回值就為0,反之則為1。
int main()
{
char arr1[5] = { 0 };
scanf_s("%s", arr1, sizeof(arr1));
printf("%s", arr1);
return 0;
}

如果輸入的字符個(gè)數(shù)>=數(shù)組空間 個(gè)數(shù),是不會(huì)打印數(shù)組中的元素的。(而scanf函數(shù)就會(huì)打印出)
2.scanf(標(biāo)準(zhǔn)的庫(kù)函數(shù))
a.代碼1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
printf("%d", a);
return 0;
}

在VS13 17 19的版本下使用scanf函數(shù)一定在最開始(#define _CRT_SECURE_NO_WARNINGS),不然會(huì)報(bào)錯(cuò)的。
b.安全性測(cè)試
int main()
{
char arr1[5] = { 0 };
int c=scanf("%s", arr1);
printf("%d\n", c);
printf("%s", arr1);
return 0;
}

當(dāng)我們輸入abcdefg 7個(gè)字符時(shí)(已經(jīng)超出了數(shù)組的空間個(gè)數(shù)了),雖然可以打印出來(lái),但是arr1附近的棧空間已被破壞了,出現(xiàn)越界的情況了。scanf_s不會(huì)打印出來(lái),也就不存在越界的行為了。
c.當(dāng)在scanf函數(shù)里面輸入格式符
如%d %d(%d%d之間有空格),那么通過(guò)標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入時(shí)兩個(gè)整型之間也加一個(gè)空格。
如%d,%d(%d%d之間逗號(hào)),那么通過(guò)標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入時(shí)兩個(gè)整型之間也加一個(gè)逗號(hào)。
3.總結(jié)
使用scanf_s函數(shù)雖然安全性比較高,但是可移植性差。比如含有scanf_s函數(shù)的代碼不一定在其它的編譯器上能夠跑過(guò)。
scanf函數(shù)雖然沒(méi)有scanf_s函數(shù)那么安全,但可移植性是比scanf_s強(qiáng)。
scanf_s函數(shù)與scanf函數(shù)的使用與比較今天就分享到這里了,如果對(duì)你有幫助的話嗎,可以給個(gè)關(guān)注,順便給個(gè)贊。
到此這篇關(guān)于C語(yǔ)言中scanf與scanf_s函數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 scanf與scanf_s內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語(yǔ)言常量定義規(guī)則知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于c語(yǔ)言常量定義規(guī)則知識(shí)點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)下。2020-03-03
使用kendynet構(gòu)建異步redis訪問(wèn)服務(wù)
這篇文章主要介紹了在kendynet上寫的一個(gè)簡(jiǎn)單的redis異步訪問(wèn)接口,大家參考使用吧2014-01-01
C++ getcwd函數(shù)獲取項(xiàng)目運(yùn)行路徑方法詳解
在Linux下做QT項(xiàng)目時(shí),需要獲取項(xiàng)目的運(yùn)行路徑,于是用getcwd函數(shù)進(jìn)行獲取,然后在Windows下進(jìn)行測(cè)試,發(fā)現(xiàn)獲取到的是程序的項(xiàng)目路徑,即代碼文件路徑,然后再Linux QT中測(cè)試,獲取到的又是運(yùn)行路徑,這就很納悶了。經(jīng)過(guò)再三測(cè)試,終于發(fā)現(xiàn)了原因2022-10-10
C++ Dijkstra算法之求圖中任意兩頂點(diǎn)的最短路徑
這篇文章主要為大家詳細(xì)介紹了用C++經(jīng)典算法-Dijkstra算法求任意兩頂點(diǎn)之間的最短路徑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C語(yǔ)言實(shí)現(xiàn)停車管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)停車管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C語(yǔ)言三個(gè)數(shù)排列大小的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇C語(yǔ)言三個(gè)數(shù)排列大小的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
Qt實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Qt實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03

