C語言中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有三個參數(shù),最后一個是變量a所占據(jù)空間的大?。▎挝粸樽止?jié)),這里可以寫1,也可以寫sizeof(a)。如果a為整型的話,第三個參數(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); 這樣會出錯的
c.代碼3
int main() { char arr1[5] = { 0 }; scanf_s("%s", arr1, sizeof(arr1)); printf("%s", arr1); return 0; }
注意:輸入字符的個數(shù)時,一定是比數(shù)組的空間個數(shù)小的,比如像上面的代碼只能輸入1-4個字符,而不是5個,不然會出錯的。(arr[4]裝的應(yīng)該是一個換行符)
d.安全性檢測
int main() { char arr1[5] = { 0 }; int c=scanf_s("%s", arr1, sizeof(arr1)); printf("%d\n", c); printf("%s", arr1); return 0; }
如果輸入的字符個數(shù)>=數(shù)組空間 個數(shù),scanf_s的返回值就為0,反之則為1。
int main() { char arr1[5] = { 0 }; scanf_s("%s", arr1, sizeof(arr1)); printf("%s", arr1); return 0; }
如果輸入的字符個數(shù)>=數(shù)組空間 個數(shù),是不會打印數(shù)組中的元素的。(而scanf函數(shù)就會打印出)
2.scanf(標準的庫函數(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),不然會報錯的。
b.安全性測試
int main() { char arr1[5] = { 0 }; int c=scanf("%s", arr1); printf("%d\n", c); printf("%s", arr1); return 0; }
當我們輸入abcdefg 7個字符時(已經(jīng)超出了數(shù)組的空間個數(shù)了),雖然可以打印出來,但是arr1附近的??臻g已被破壞了,出現(xiàn)越界的情況了。scanf_s不會打印出來,也就不存在越界的行為了。
c.當在scanf函數(shù)里面輸入格式符
如%d %d(%d%d之間有空格),那么通過標準輸入設(shè)備(鍵盤)輸入時兩個整型之間也加一個空格。
如%d,%d(%d%d之間逗號),那么通過標準輸入設(shè)備(鍵盤)輸入時兩個整型之間也加一個逗號。
3.總結(jié)
使用scanf_s函數(shù)雖然安全性比較高,但是可移植性差。比如含有scanf_s函數(shù)的代碼不一定在其它的編譯器上能夠跑過。
scanf函數(shù)雖然沒有scanf_s函數(shù)那么安全,但可移植性是比scanf_s強。
scanf_s函數(shù)與scanf函數(shù)的使用與比較今天就分享到這里了,如果對你有幫助的話嗎,可以給個關(guān)注,順便給個贊。
到此這篇關(guān)于C語言中scanf與scanf_s函數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)C語言 scanf與scanf_s內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++ 中const關(guān)鍵字的用法小結(jié)
C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。這篇文章主要介紹了C/C++ 中const關(guān)鍵字的用法,需要的朋友可以參考下2020-02-02