C++ VS 2013“;Scanf";不安全的

C++ VS 2013“;Scanf";不安全的,c++,visual-studio-2013,C++,Visual Studio 2013,我试图在VS2013中编写一个简单的测试程序。它告诉我scanf()是不安全的,我应该使用scanf\u()。更糟糕的是,它告诉我,intx是未初始化的(不仅仅是作为警告或错误),即使它不需要在那里初始化。我想知道是否有可能更改设置,以便VS2013不会给我这些错误消息,或者找出我做错了什么 #include <stdio.h> int main(){ printf("How many pizzas did you make: "); int x; scan

我试图在VS2013中编写一个简单的测试程序。它告诉我
scanf()
是不安全的,我应该使用
scanf\u()
。更糟糕的是,它告诉我,
intx
是未初始化的(不仅仅是作为警告或错误),即使它不需要在那里初始化。我想知道是否有可能更改设置,以便VS2013不会给我这些错误消息,或者找出我做错了什么

#include <stdio.h>

int main(){
    printf("How many pizzas did you make: ");
    int x;
    scanf("%d", x);
}
#包括
int main(){
printf(“你做了多少比萨饼:”);
int x;
scanf(“%d”,x);
}

您可能在这一行中犯了错误

  scanf("%d", &x);

scanf被警告为不安全,因为它可能导致缓冲区溢出。scanf需要地址
x
,所以它应该是
&x

使用cout代替printf(),使用cin代替scanf 例如:


示例代码中有一个直接错误和一个可能的bug:

scanf("%d", x);
上面需要一个指针,您必须始终验证所有输出参数是否匹配

第二,微软支持迫使你放弃标准C库函数,甚至宣称它们的使用是不可承受的风险,而不是说C标准可选部分中更安全的函数也不能以不安全的方式使用

在编译器文档中,有一个标志可以抑制这种恼人的行为


无论如何,你在C++中写作,所以这里的每个人都会说你应该使用IoSokes和惯用的C++,不管你怎么问或为什么。cin而不是scanf

scanf
是不安全的:您可以在格式字符串中告诉它您正在传递一个整数,但给它一个指向浮点数的指针,该错误在运行时才会被捕获,在运行时会发生崩溃。只需使用
std::cin
即可。同样的情况也适用于<代码> Prtff。不,但是Prtf和Sncf是C函数,CUT和CIN是C++的,因为你在VS中写的更兼容,功能几乎是相同的,最后它们不是语言的一部分,刚才图书馆听说PROTFF/SCANF使用的资源少,差别不大,实际上不是一个功能的问题,是语言,C++做的更多的工作要编译。cin和cout更安全,因为您不必知道格式,这使得scanf和printf更容易制作文档mistake@Cornflower_blue:它因人而异<代码>操作程序在这种情况下不可能出现缓冲区溢出。您应该使用C++中的SCANF等类似于“我正在编写JavaScript程序,为什么不调用java函数?”(反之亦然)。它们可能有相似的词根,但在历史上的这一点上,它们是两种完全不同的语言。@casey:使用标准C函数有一些优点,尽管对于
printf
来说比对于
scanf
:使用格式字符串而不是将字符串分成块更容易本地化。不管怎样,我已经包括了惯用的C++。JavaScript和java的比较是几个数量级,太陡峭了,C++函数,即使只是裸露的金属。不管怎么说,在适当的情况下,降低级别并不是一个错误,我有点失望的是,大量的人盲目地谴责每行不使用至少50个模板。如果你这样说,这是有道理的。(我对模板和lambdas的过度使用感到失望,我避免使用模板,除非我必须使用它们。此外,VC2010/2012无论如何都不完全支持该标准,因此我从未尝试过lambdas或move语义……它们比其他任何东西都更让我害怕)。
using std;
scanf("%d", x);