如何删除有关在Qt中使用scanf的警告?

如何删除有关在Qt中使用scanf的警告?,qt,security,scanf,Qt,Security,Scanf,我在我的程序中使用了scanf(),当我编译它时,我收到了很多关于使用scanf的警告,如下所示: D:\myspace\projects\nnf\NNFAdaptor\NNFAdaptor\main.cpp C4996:“scanf”:此函数或变量可能不安全。考虑使用SncFis代替。要禁用弃用,请使用_CRT\u SECURE\u NO\u警告 我也尝试过使用“CRT\u SECURE\u NO\u警告”,但它没有出现在我的Qt(标题)中,它显示为错误。在main.cpp的顶部(在任何\in

我在我的程序中使用了scanf(),当我编译它时,我收到了很多关于使用scanf的警告,如下所示: D:\myspace\projects\nnf\NNFAdaptor\NNFAdaptor\main.cpp C4996:“scanf”:此函数或变量可能不安全。考虑使用SncFis代替。要禁用弃用,请使用_CRT\u SECURE\u NO\u警告


我也尝试过使用“CRT\u SECURE\u NO\u警告”,但它没有出现在我的Qt(标题)中,它显示为错误。

在main.cpp的顶部(在任何
\includes
之前)放置
\define\u CRT\u SECURE\u NO\u警告。

这类警告大多是错误的(特别是关于使用什么来代替)但确实不应该使用scanf,因为:

  • 编写危险的格式规范非常容易,就像
    get
    危险一样,也就是说,它会在没有注意到的情况下写入缓冲区的末尾。可以编写没有这个问题的格式规范,但这要困难得多
  • 几乎不可能编写一个基于scanf的输入解析器来可靠地处理格式错误的输入
  • 任何数字转换中的溢出在技术上都是未定义的行为,这意味着C库被允许仅仅因为有人键入了太多的数字而使程序崩溃。(好的C库不会比在结果变量中生成垃圾更糟糕,但这本身可能是一件令人头痛的事情。)
  • 您应该而不是使用
    scanf_s
    ;它试图掩盖问题1,但并没有完全成功,也根本没有解决问题2和问题3。由于您使用的是Qt,我建议您:

    • 使用
      std::getline
      将整行读入
      std::string
      s
    • 使用
      QRegExp
      解析它们
    • 将数字字符串转换为数字,例如使用
      QString::toDouble
    如果您的输入语法比正则表达式所能处理的更复杂,请调查
    QLALR