2

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

我也尝试使用 _CRT_SECURE_NO_WARNINGS 但它不存在于我的 Qt(标题)中,它显示为错误。

4

2 回答 2

11

放在#define _CRT_SECURE_NO_WARNINGSmain.cpp 的顶部(在 any 之前#includes)。

于 2013-06-12T13:51:57.227 回答
4

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

  1. 以与危险相同的方式编写危险的格式规范非常容易gets,即它会在不注意的情况下写入缓冲区的末尾。可以编写存在此问题的格式规范,但要困难得多。
  2. 几乎不可能编写一个scanf基于 - 的输入解析器来可靠地处理格式错误的输入。
  3. 任何数字转换中的溢出在技术上都是未定义的行为,这意味着允许 C 库仅仅因为有人键入太多数字而使您的程序崩溃。(好的 C 库不会做任何比在结果变量中产生垃圾更糟糕的事情,但这本身就是一件令人头疼的事情。)

你不应该改用scanf_s;它试图掩盖问题 1,但并没有完全成功,它根本没有解决问题 2 和 3。由于您使用的是 Qt,我建议:

  • 使用 .将整行读入std::strings std::getline
  • 用 解析它们QRegExp
  • 使用例如将数字字符串转换为数字QString::toDouble

如果您的输入语法比正则表达式处理的更复杂,请调查QLALR.

于 2013-06-12T13:54:06.900 回答