错误C4996:“scanf”:此函数或变量在c编程中可能不安全

错误C4996:“scanf”:此函数或变量在c编程中可能不安全,c,windows,visual-studio,c11,tr24731,C,Windows,Visual Studio,C11,Tr24731,我创建了一个小应用程序,通过使用带有参数的用户定义函数来查找最大数。当我运行它时,它会显示以下消息 错误1错误C4996:“scanf”:此函数或变量可能不安全。 考虑使用SncFis代替。要禁用弃用,请使用 _CRT\u安全\u无警告。有关详细信息,请参阅联机帮助 我该如何解决此问题 这是我的密码 #include<stdio.h> void findtwonumber(void); void findthreenumber(void); int main() { in

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

错误1错误C4996:“scanf”:此函数或变量可能不安全。 考虑使用SncFis代替。要禁用弃用,请使用 _CRT\u安全\u无警告。有关详细信息,请参阅联机帮助

我该如何解决此问题

这是我的密码

#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);
}

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

使用scanf_可防止可能的缓冲区溢出。 见:

关于为什么scanf可能是危险的很好的解释:


因此,根据建议,您可以尝试用scanf_s替换scanf或禁用编译器警告。

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

#define _CRT_SECURE_NO_WARNINGS

您可以在预处理器定义中添加_CRT_SECURE_NO_警告

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


嗯,这是一个被视为错误的警告。或者按照建议执行,并用scanf_s替换scanf,或者按照它告诉您的方式禁用它。只需查看编译器警告。scanf_s可防止可能的缓冲区溢出。看,我不确定问题是什么。替换或禁用为:define(定义)CRT(定义)SECURE(定义)NO(定义)警告可能重复如何禁用编译器警告?@VOLVO:要禁用编译器警告,请在程序的最顶端添加以下语句:define(定义)CRT(定义)安全)NO(定义)警告。是否有任何理由说明支持scanf_s的实现不应该将scanf链接到同一个函数?@supercat:,包括效率和可移植性。@DevSolar:该页面甚至没有提到scanf_s。此外,在将正常功能转换为安全功能的大多数其他示例中,正确的替换应该是memcpy。例如,在string_dup示例中,页面抱怨使用strcpy添加了冗余的字符串长度度量,但使用strcpy的版本已经包含了冗余度量。一个合适的函数应该测量源长度一次,然后使用memcpy复制除最后一个字节以外的所有内容或全部内容,并将目标的最后一个字节归零。澄清一下:在顶部表示包含行之前。例如,如果你把它放在include下面,你仍然会得到警告,因为当你禁用它时已经太晚了。@FabioTurati提到了一个非常重要的点。无论何时创建默认CPP项目,它都会创建包含main方法的.CPP文件。要引用所有头文件,它引用一个名为stdafx.h的集中头文件,其中包含所有include语句。因此,当我在所有include语句之前在.cpp文件的顶部编写define _CRT _SECURE(定义)NO(安全)警告时,没有任何区别。但是当我将它添加到stdafx.h文件的顶部时,错误终于消失了。或者,将/D_CRT_SECURE_NO_WARNINGS/wd4996添加到编译选项中。这应该是公认的答案。