在C語言中使用scanf語句時遇到的問題總結


    在使用visual studio2013編寫c語言代碼時,遇到了這樣的幾個小問題,進行如下的總結。

1, 關於使用scanf語句報錯的解決方案1

#include <stdio.h>
int main(void)
{
    char ch;

    printf("Please enter a character.\n");
    scanf("%c", &ch);   
    printf("The code for %c is %d.\n", ch, ch);

    return 0;
}

    如上所示的代碼,之前在其他的編譯平台,就可以正常的運行,例如運行時,你輸入字母c,便會打印出The code for c is 67.但是在visual studio2013中運行會提示如下所示的錯誤:

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_s,再次運行,發現不再提示編譯錯誤。仔細分析一下原因:

    其實從官網文檔中可以得知,出現這種問題,只是因為這是新版vc庫添加的警告,微軟認為scanf的使用存在安全隱患,因為C/C++中的字符串處理都是以\0為截止符的,如果搜索不到\0,容易出現字符串越界所有vc擴展的所謂安全標准庫,都添加了一個參數用以指定字符串參數的長度,用以避免這種安全隱患。其實要避免出現這種問題,解決方法很簡單,鼠標單擊“項目文件”,按下Alt+Enter,顯示如下界面,

demo1

    點擊c/c++,預處理器選項,選擇右側的預處理器定義,並選擇編輯並在編輯框中添加一行內容_CRT_SECURE_NO_DEPRECATE就OK了。按下ctrl+F5運行程序不在報錯,程序運行正常,

DEMO2

2.按照系統提示,更改scanf為scanf_s

    如果,我們按照系統提示更改為scanf_s,我們運行程序,系統不再報錯,但是程序運行時,我們同樣輸入輸入C,查看結果如下所示,

DEMO3

    那么問題又來了,無論我們我們輸入什么字符,系統輸出結果總是The code for     is  0.只有是為什么呢,我們查看官方關於這個問題的解答(鏈接地址http://msdn.microsoft.com/en-us/library/w40768et.aspx),

a single character may be read as follows:

<P>char c;
<P>scanf_s("%c", &amp;c, 1);</P>

 

When multiple characters for non-null terminated strings are read, integers are used as the width specification and the buffer size.

<P>char c[4];
<P>scanf_s("%4c", &amp;c, _countof(c)); // not null terminated</P>

    原來是因為scanf_s在使用該功能是,有新的規定,必須在最后面聲明要讀取的字符串的長度,我們按照MSDN上面的備注,更改程序如下:

#include <stdio.h>
int main(void)
{
    char ch;

    printf("Please enter a character.\n");
    scanf_s("%c", &ch,1);   //從鍵盤讀取一個字符
    printf("The code for %c is %d.\n", ch, ch);

    return 0;
}

    再次運行程序,輸出結果如下:

DEMO4

總結:很多時候,官方文檔是最權威的參考資料,作為一個開發者,學會高效的使用官方文檔是尤為重要的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM