程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言雜談(一)scanf()、scanf_s()與錯誤 C4996,scanf_sc4996

C語言雜談(一)scanf()、scanf_s()與錯誤 C4996,scanf_sc4996

編輯:關於C語言

C語言雜談(一)scanf()、scanf_s()與錯誤 C4996,scanf_sc4996


錯誤 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檢查。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved