2016-06-28 162 views
-3

下面是一個簡單的C++代碼:錯誤C4996是什麼意思?

#include <cstring> 
using namespace std; 

int main(int argc, _TCHAR* argv[]) 
{ 
    char str[80]; 
    cout << "輸入字串:"; 
    gets(str); 
    cout << "輸入的字串:" << str << endl; 
    return 0; 
} 

當編譯它,我得到以下錯誤:

"錯誤1 error C4996: 'gets': This function or variable may be unsafe.

Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."

+1

這意味着「獲取」可能是不安全的,你應該考慮使用gets_s代替。或者你可以定義_CRT_SECURE_NO_WARNINGS來禁用警告。您可以在聯機幫助的某處找到更多詳細信息,可能是通過搜索「C4996」或「獲取」。 – immibis

+0

當我使用gets_s()函數而不是gets()。沒關係! –

+0

'gets'是如此危險,以至於它在C和C++中都被棄用了。 –

回答

3

在真正的C++11或C++ 14中,讀取整行的正確方法是std::getlinestd::basic_istream::getline

此外,您最好在讀取輸入之前刷新輸出;請記住C++和C標準IO功能是buffering

C89 gets功能,因爲很長一段時間(大概十餘年)已過時,現在禁止的,因爲它是如此危險(不能避免buffer overflow)。所以請忘掉它(在C99或C11中,使用fgets代替,在POSIX上使用C99或C11,使用getline;在C++ 11或C++ 14中使用,正如我所說的std::getlinestd::basic_istream::getline)。

main的身體應該是:

string str; 
cout << "輸入字串:" << flush; 
getline(cin,str); 
cout << "輸入的字串:" << str << endl; 
return 0; 

使用std::string的好處是,你的用戶可以輸入一個任意長的線路(最多實現限制,或許是萬字的)。

如果您正在使用像MacOSX或Linux這樣的POSIX系統進行編碼,那麼在terminal上閱讀時,可以使用GNU readline庫和函數(另請參閱ncurses)。最大的好處是你的用戶在輸入他的行時有編輯能力(和完成)。

PS。編程時的一般提示:在編碼之前閱讀您正在使用的每個函數的文檔

1

這意味着你應該使用的gets_s()代替gets() 編譯器通常知道什麼是最好的方案和什麼不應該被允許。