2013-06-12 52 views
2

我在我的程序,當我編譯它,我得到了很多關於使用scanf函數的如下警告使用scanf()的\ MySpace的\項目\ NNF \ NNFAdaptor \ NNFAdaptor \ main.cpp中 C4996: 'scanf':這個函數或變量可能是不安全的。考慮使用scanf_s代替。要禁用棄用,請使用_CRT_SECURE_NO_WARNINGS。如何刪除關於在Qt中使用scanf的警告? d:

我也嘗試過使用_CRT_SECURE_NO_WARNINGS,但它不存在於我的Qt(頭文件)中,它顯示爲錯誤。

回答

9

#define _CRT_SECURE_NO_WARNINGS放在main.cpp的頂部(在任何#includes之前)。

3

該類警告的大多是錯的(特別是什麼,而不是使用),但它確實是真的,你不應該使用scanf,因爲:

  1. 這是很容易寫的格式規範,是危險的方式與gets的危險性相同,即它會在緩衝區的末尾寫入而不會注意。它可能編寫的格式規範沒有這個問題,但它更難。
  2. 編寫基於scanf的輸入解析器幾乎是不可能的,它可以可靠地處理不規則輸入。
  3. 任何數字轉換中的溢出在技術上都是未定義的行爲,這意味着C庫只能因爲某人鍵入了太多數字而被允許崩潰程序。 (良好的C庫不會做任何遜於產生垃圾在你的結果變量,但它本身可以是一個頭痛的問題。)

你應該使用scanf_s代替;它試圖對問題1進行論證,但並不完全成功,而且它根本不涉及問題2和問題3。由於您使用的是Qt,因此我推薦:

  • 使用std::getline將整行讀入std::string s。
  • QRegExp解析它們。
  • 將數字字符串轉換爲數字。 QString::toDouble

如果您的輸入語法比正則表達式可以處理更復雜,請調查QLALR