void main(){int a[10];int i;for(i=0;i<10;i++){scanf("%d",&a[i]);}a[5]=a[5]+5;
printf("%d",a[5]);getch();}回答:很多涉及字符串的函數是不檢查越界的, 不安全。 所以後來有壹套新的安全函數替代這個, 第壹個warning就是建議妳用 scanf_s代替scanf 第二個 warning是說妳用的 getch()沒定義, 所以編譯器假定它是 int getch(void)。 用的函數最好先 include好頭文件
warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS
已經是安全主導的年代了,這些老舊的東西微軟提供了壹些新函式來取代,很簡單他在後面加了_s ,例如gets == gets_s ,strcpy == strcpy_s原因解釋這種微軟的警告,主要因為那些C庫的函數,很多函數內部是不進行參數檢測的(包括越界類的),微軟擔心使用這些會造成內存異常,所以就改寫了同樣功能的函數,改寫了的函數進行了參數的檢測,使用這些新的函數會更安全和便捷。關於這些改寫的函數妳不用專門去記憶,因為編譯器對於每個函數在給出警告時,都會告訴妳相應的安全函數,查看警告信息就可以獲知,在使用時也再查看壹下MSDN詳細了解。庫函數改寫例子:
mkdir改寫為 _mkdir
fopen”改寫為 fopen_s
stricmp改寫為 stricmp_s
strcpy改寫為strcpy_s解決方案:1 根據下面的warning提示:參見“fopen”的聲明
消息:“This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
所以可以將函數按warning提示的第二句,改為使用fopen_s函數即可:
例如:FILE *pFile=fopen("1.txt", "w");改為:FILE* pFile;
fopen_s(&pFile, "1.txt", "w");
2 還是根據warning提示的地三句話:use _CRT_SECURE_NO_DEPRECATE
項目|屬性|配置屬性|C/C++|命令行|附加選項,加入/D "_CRT_SECURE_NO_DEPRECATE" (註:加入中括號中完整的內容)
3 降低警告級別:項目|屬性|配置屬性|C/C++|常規,自己根據情況降低警告級別(此法不推薦)
註意:高度重視警告:使用編譯器的最高警告級別。應該要求構建是幹凈利落的(沒有警告)。理解所有警告。通過 修改代碼而不是降低警告級別來排除警告。
編譯器是妳的朋友。如果它對某個構造發出警告,這經常是說明妳的代碼中存在潛在的問題。成功的構建應該是無聲無息的(沒有警告的)。《