錯誤 C4996
初學C語言時,第一個接觸到的I/O函數便是scanf()了。但在高版本的 Visual Studio (包括但不限於2015、2013、2012)編譯代碼時,卻會出現意想不到的錯誤。
有如下一段簡單的代碼:
#include "stdio.h" int main(void) { int i; printf("Input i\n"); scanf("%d", &i); printf("i is %d", i); return 0; }
但會輸出一個錯誤 C4996,錯誤信息如下
錯誤 1 error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
報錯說scanf不安全,推薦將scanf替換scanf_s。替換之後之後,代碼如下
#include "stdio.h" int main(void) { int i; printf("Input i\n"); scanf_s("%d", &i); printf("i is %d", i); return 0; }
便沒有錯誤提示了。
scanf與scanf_s
在MSDN有介紹這些以_s結尾的函數,包括 scanf_s、scanf_s_l、wscanf_s、_wscanf_s_l。這些版本的函數具有安全增強功能。
scanf等函數存在於版本較舊的CRT(C runtime library, part of the C standard library)中,具有安全性問題,比如在讀取字符時,若不指定%s的寬度,可能會導致緩沖區溢出。
在使用scanf時,如果規定了讀取的寬度,便不會報錯。將代碼修改如下:
#include "stdio.h" int main(void) { int i; printf("Input i\n"); scanf_s("%5d", &i); printf("i is %d", i); return 0; }
這裡控制了讀入的%d寬度為5。但是讀入的數據超過寬度的限制時,便會丟失數據。比如這是輸入100000,輸出的i值為10000。
解決方法
1.使用scanf時規定寬度。
2.使用sacnf_s替換sacnf。
3.在新建項目的時候取消SDL檢查。