1. 程式人生 > >C語言常見錯誤雜談(一)scanf()、scanf_s()與錯誤 C4996與解決方法

C語言常見錯誤雜談(一)scanf()、scanf_s()與錯誤 C4996與解決方法

錯誤 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

本文由 whchina(江城老溫)原創釋出,轉載請註明出處,江城老溫 as a thinker。

相關推薦

C語言常見錯誤雜談scanf()scanf_s()錯誤 C4996解決方法

錯誤 C4996 初學C語言時,第一個接觸到的I/O函式便是scanf()了。但在高版本的 Visual Studio (包括但不限於2015、2013、2012)編譯程式碼時,卻會出現意想不到的錯誤。 有如下一段簡單的程式碼: #include "stdio.h" int main(void) {

C語言代碼訓練

color tro 題型 blank adding bsp 喜歡 add 方便 今天我們先來講解一道C語言的經典例題,也是從零開始系列中的一道課後練習題。 請用控制臺程序繪制如下圖案。 循環經典例題 分析情況 這個題目是要求打印30行"*",每行打印的個數不同。通過這

C語言基礎複習筆記指標

最近linux很火,年前對linux再詳細瞭解了個大概,結合在windows平臺活躍與強大無比的C++,最終得出一個結論:C語言依然強大。 過年回來,便對的C語言充滿了興趣,於是乎去網上下載了教程回來,細細研讀,基礎程式設計思想始終是很重要的。 首先,入手的便是C語言的核心精華部分,指標。要

c語言指標進階

指標也是一種資料型別 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。 1)指標是一種變數,佔有記憶體空間,用來儲存記憶體地址

C語言面向物件程式設計:封裝繼承

最近在用 C 做專案,之前用慣了 C++ ,轉回頭來用C 還真有點不適應。 C++ 語言中自帶面向物件支援,如封裝、繼承、多型等面向物件的基本特徵。 C 原本是面向過程的語言,自身沒有內建這些特性,但我們還是可以利用 C 語言本身已有的特性來實現面向物件的一些基本特徵。接下來

程式設計菜鳥到大佬之路:C語言程式特別篇

程式設計習題 迴圈例題選講 例1.乘方計算 給出一個整數a和一個正整數n,求乘方ana^nan。 輸入:一行,包含兩個整數a和n。 -1000000 <= a <= 1000000,1 <= n <= 10000。 輸出:一個整數,

C語言入門之旅

特殊的迴圈語句 ,讓for迴圈開始的方法: 將sum初始化為0;或者先在迴圈體外讀第一個數 注意要先判斷再運算,避免最後一個數據發生錯誤 for(sum=0;n!=-1;) { sum+=n; scanf(“%d”, n); } 輸入x,y之間的閏年 i

C語言編程練習

ota fin void 語言 enc main.c pre rotate mail 問題描述:.給出一個英語句子,希望你把句子裏的單詞順序都翻轉過來    輸入樣例:I love you   輸出樣例:you love I 1 /****************

Windows下C語言開發環境配置:MinGW的簡介和安裝

Windows下C語言開發環境配置(一):MinGW的安裝和eclipse的配置 1.什麼是MinGW? MinGW即Minimalist GNU for Windows,是一個簡單Windows本地應用的開發環境。MinGW包含有一組GNU編譯器的集合(包

C語言基礎面試題

1.寫出判斷ABCD四個表示式的是否正確, 若正確, 寫出經過表示式中 a的值 int a = 4; (A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++); a = ?答:C錯誤,左側不是一個有效變

C語言之網路程式設計域名解析

在網路程式設計時,知道域名是不能直接訪問一個主機的,需要轉換成相應的IP地址。有時在程式中需要將一個IP地址轉換成一個域名。本節將講解C程式中的IP地址與域名的轉換問題。 提示:在TCP/IP網路中,通訊雙方的主機必須知道彼此的IP地址方可進行正常的通訊,如果給出的主機的域

C語言經典筆試題

1、請填寫bool , float, 指標變數 與“零值”比較的if 語句。 提示:這裡“零值”可以是0, 0.0 , FALSE 或者“空指標” 。例如int 變數n 與“零值”比較的if 語句為: if ( n == 0 ) if ( n

C語言筆試題紀錄

分配方式有三種:   1、從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。   2、在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中

C語言學習重點總結基本資料型別分析

一.資料型別的含義: 1.資料型別可以理解為固定大小的別名; 2.資料型別是建立變數的模子; 二.變數的本質: 1.變數是一段實際連續儲存空間的別名; 2.程式中通過變數來申請並命名儲存空間; 3.通過關鍵字可以使用儲存空間; 例項分析: 步驟:

c語言練手專案

統計檔案的字元數、單詞數以及總行數,包括: 每行的字元數和單詞數 檔案的總字元數、總單詞數以及總行數 注意: 空白字元(空格和tab縮排)不計入字元總數; 單詞以空格為分隔; 不考慮一個單詞在兩行的情況; 限制每行的字元數不能超過1000。 請先看程式碼:

淺談C語言的資料儲存

程式由指令和資料組成,C語言程式亦是如此。開發者在編寫程式的時候往往需要根據不同資料的特點以及程式需求來選擇不同的資料儲存方式,那麼在C語言中資料的儲存分為哪些方式呢? C程式大致來講可以分為四個資料區:常量區,靜態去,堆區,棧區。 其中常量區儲存了未被作為初始化使用的字

linux下C語言多執行緒執行緒的建立取消

#include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void

go語言學習之路——go在win10下的安裝配置

一 下載go包1.可以去go的官網上去下載(需要梯子),一般可以從國內的映象中下載,地址:https://www.golangtc.com/download二 go環境變數的配置1、將Go的壓縮包解壓到任意目錄,我的為D:\go 2、 配置GoRoot路徑開啟系統屬性:環境變

Java常見錯誤整理

最新 java虛擬機 home 64位安裝 .cn www. 錯誤 jdk8 image 1、配置完Java環境變量之後,仍然不能使用java命令。 解決方法: 如果是Windows10系統出現此問題,是因為個別Windows10系統不識別“JAVA_HOME”環

Android開發常見異常錯誤系列

一、前言 這系列文章是自己在平時開發過程中遇到的問題。之前只是記在雲筆記上面,現在整理一下,發出來共享。 ps:像那些什麼沒有註冊Activity呀,許可權呀等最基本的就不再贅述。 二、ADB連線異常 有時我們發現,即使自己從工作管理員裡面把adb.ex