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

Chh*_*rum 13 c windows tr24731 visual-studio c11

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

错误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);
}
Run Code Online (Sandbox Code Playgroud)

use*_*467 12

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

用法scanf_s可防止可能的缓冲区溢出.
请参阅:http: //code.wikia.com/wiki/Scanf_s

关于为什么scanf会有危险的好解释:scanf的缺点

因此,作为建议,可以尝试更换scanfscanf_s或禁用编译器警告.

  • 如何禁用编译器警告? (9认同)
  • @VOLVO:要禁用编译器警告,请在程序的最顶层添加以下语句:`#define _CRT_SECURE_NO_WARNINGS`. (8认同)

eli*_*etm 10

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

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

在此处输入图片说明


Jer*_*yal 8

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

#define _CRT_SECURE_NO_WARNINGS
Run Code Online (Sandbox Code Playgroud)

  • 澄清一下:"在顶部"的意思是"在`#include`行之前".例如,如果你把它放在`#include <stdio.h>`下面,你仍会得到警告,因为当你禁用它时,它已经太晚了. (8认同)
  • @FabioTurati提到了一个非常重要的观点.每当我们创建一个默认的CPP项目时,它就会创建包含`main`方法的`<projectName> .cpp`文件.要引用所有头文件,它引用一个名为`stdafx.h`的集中头文件,其中包含所有include语句.因此,当我在所有include语句之前在`<projectName> .cpp`文件的顶部写入`#define _CRT_SECURE_NO_WARNINGS`时,它没有任何区别.但是当我将它添加到`stdafx.h`文件的顶部时,最后错误就消失了. (2认同)
  • 或者,将“/D_CRT_SECURE_NO_WARNINGS /wd4996”添加到编译选项中。 (2认同)