【问题标题】:error C4996: 'scanf': This function or variable may be unsafe in c programming错误 C4996:“scanf”:此函数或变量在 c 编程中可能不安全
【发布时间】:2015-08-15 03:35:55
【问题描述】:

我创建了一个小型应用程序,通过使用带有参数的用户定义函数来查找最大数量。当我运行它时,它会显示此消息

错误 1 ​​错误 C4996:“scanf”:此函数或变量可能不安全。 考虑改用 scanf_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅在线帮助。

我该怎么做才能解决这个问题?

这是我的代码

#include<stdio.h>

void findtwonumber(void);
void findthreenumber(void);

int main() {
    int n;
    printf("Fine Maximum of two number\n");
    printf("Fine Maximum of three number\n");

    printf("Choose one:");
    scanf("%d", &n);
    if (n == 1)
    {
        findtwonumber();
    }
    else if (n == 2)
    {
        findthreenumber();
    }
    return 0;
}

void findtwonumber(void)
{
    int a, b, max;
    printf("Enter a:");
    scanf("%d", &a);
    printf("Enter b:");
    scanf("%d", &b);
    if (a>b)
        max = a;
    else
        max = b;
    printf("The max is=%d", max);
}

void findthreenumber(void)
{
    int a, b, c, max;
    printf("Enter a:");
    scanf("%d", &a);
    printf("Enter b:");
    scanf("%d", &b);
    printf("Enter c:");
    scanf("%d", &c);
    if (a>b)
        max = a;
    else if (b>c)
        max = b;
    else if (c>a)
        max = c;
    printf("The max is=%d", max);
}

【问题讨论】:

标签: c windows visual-studio c11 tr24731


【解决方案1】:

听起来这只是一个编译器警告。

使用scanf_s 可以防止可能的缓冲区溢出。
见:http://code.wikia.com/wiki/Scanf_s

很好地解释了为什么scanf 可能是危险的:Disadvantages of scanf

因此,按照建议,您可以尝试将 scanf 替换为 scanf_s 或禁用编译器警告。

【讨论】:

  • 如何禁用编译器警告?
  • @VOLVO:要禁用编译器警告,请在程序的最顶部添加以下语句:#define _CRT_SECURE_NO_WARNINGS
  • 维基链接显示scanf_s 是“与scanf 相同,但它是安全的。”有什么理由可以支持scanf_s 的实现不应该有scanf 不链接到同一个函数?
  • @supercat: Lots of them,包括效率和可移植性。
  • @supercat 所以首先你要问原因。我向您指出标准委员会关于附件 K“安全”功能的详细论文(根据定义,即使您在全文搜索中找不到它,也包括 scanf_s),然后您开始争论细则,好像那些人不知道他们在说什么。 不错
【解决方案2】:

另一种抑制错误的方法:在 C/C++ 文件的顶部添加这一行:

#define _CRT_SECURE_NO_WARNINGS

【讨论】:

  • 澄清一下:“在顶部”的意思是“在#include 行之前”。例如,如果你把它放在#include&lt;stdio.h&gt; 下面,你仍然会收到警告,因为当你禁用它时已经太晚了。
  • @FabioTurati 提到了非常重要的一点。每当我们创建一个默认的 CPP 项目时,它就会创建包含 main 方法的 &lt;projectName&gt;.cpp 文件。要引用所有头文件,它指的是一个名为 stdafx.h 的集中式头文件,其中包含所有包含语句。因此,当我在所有包含语句之前在&lt;projectName&gt;.cpp 文件的顶部写#define _CRT_SECURE_NO_WARNINGS 时,它没有任何区别。但是当我将它添加到 stdafx.h 文件的顶部时,错误终于消失了。
  • 或者,将/D_CRT_SECURE_NO_WARNINGS /wd4996 添加到您的编译选项中。
【解决方案3】:

您可以在预处理器定义中添加“_CRT_SECURE_NO_WARNINGS”。

右键单击您的项目->属性->配置属性->C/C++ ->预处理器->预处理器定义。

【讨论】:

    【解决方案4】:

    另一种方法是当你创建一个新项目时,你不点击安全开发生命周期 (SDL) 检查:

    或者,如果您在一个项目中: 右击你的project-&gt;Properties-&gt;Configuration Properties-&gt;C/C++ -&gt;All Options&gt;滚动鼠标找到SDL checks,编辑成NO(/sdl-),然后应用,OK

    【讨论】:

      【解决方案5】:

      简单的答案是:scanf() 函数读取从第一个字符到第一个空格的字符/字符串。

      【讨论】:

      【解决方案6】:

      #define scanf scan_f

      用安全的版本替换不安全的版本。

      【讨论】:

        猜你喜欢
        • 2012-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多