最近在學習中發現了乙個據說較scanf更安全的函式---scanf_s。
scanf在讀取時不檢查邊界,所以可能造成記憶體訪問越界,舉例說明:
char buf[16];
scanf("%s",buf);
當輸入了16個以上的字元時,多接收的字元會被寫入其他記憶體空間中,從而產生問題。
而使用scanf_s後,這種問題可以得到解決:
char buf[16];
scanf_s("%s",buf,15);
如此只會接收不超過15個字元的輸入(最後乙個字元位置要放'\0')。
在實際使用中,我又遇到了乙個問題,就是scanf_s並不忽略空格,它將被空格隔開的字串視為兩個輸入流,舉例說明:
char buf[8];
scanf_s("%s",buf,8);
printf("%s",buf);
輸入:123(空格)456(回車)
輸出:123
後來在一篇博文上找到了解決辦法,即用%[ ]來進行多個字元的輸入,並對結束符做自定義。具體用法是在[ ]中規定字串的結束符(「^」加「自定義的結束符」),舉例說明:
scanf_s(%[ ^\n],buf,8); //表示以換行符(\n)結束字串的輸入
printf("%s",buf);
輸入:123(空格)456(回車)
輸出:123(空格)456
注:我找到的那篇博文對此的使用方法是基於scanf的,我試了一下scanf_s同樣適用
scanf s 函式的用法
scanf 在vs2013裡報錯,編譯器提示要用scanf s代替 scanf s 引數與scanf 不同 例如scanf s name,n 整形n為name型別的大小,如果name是陣列,那n就是該陣列的大小。include includestruct student int main 輸出結果 ...
Visual Studio中scanf s的使用
1.scanf在vs裡面已經棄用了,因為其對讀取輸入的空間沒有約束,容易造成記憶體越界的問題,建議使用scanf s代替。2.scanf s在讀取字串或字元輸入時需要在引數列表中新增長度約束,如 scanf s s stra,100 來限制其對記憶體的訪問 3.scanf s與scanf有同樣的輸入...
scanf與scanf s的區別
自從用visualstudio2015之後就不願再去使用visual c 6.0了,但是最近在學資料結構圖時,總是在字元的連續輸入遇到困惑.使用vs都知道,要用scanf s對鍵盤讀入資料。scanf c,c a,b 可以對字元連續輸入 如果是迴圈輸入,在下新增getchar 這樣乙個語句吞噬掉輸入...