关于VS2017使用scanf报错的问题(图文)

在用VS2017编译一个程序时,如果你在程序中使用了C语言的输入函数scanf,会发现这样的警告:

关于VS2017使用scanf报错的问题(图文)_第1张图片

大致意思是说scanf这个函数不安全,让程序员考虑使用scanf_s,并给出了一种停用这个警告的方式。

下面给出三种解决方法

方法一:在代码的最顶行写入#define _CRT_SECURE_NO_WARNINGS可以让之后使用scanf时不出现警告。

方法二:修改文件属性也可以做到和方法①一样的效果,具体操作如下:

在右侧选中文件,右键属性:

关于VS2017使用scanf报错的问题(图文)_第2张图片关于VS2017使用scanf报错的问题(图文)_第3张图片

依次选中:C/C++ >> 预处理器,在右侧预处理器定义右侧添加上:_CRT_SECURE_NO_DEPRECATE

关于VS2017使用scanf报错的问题(图文)_第4张图片

确定。

方法三:使用scanf_s

scanf在读取数据时不检查边界,可能会造成内存访问越界的问题,使用scanf_s,会多一个参数来控制读取的字符数量,这样确实比使用scanf输入更加安全。

下面举一个很简单的例子:

定义char s1[5]; 输入时故意超出s1的范围,比较两种输入的处理方式:

①用scanf输入:

关于VS2017使用scanf报错的问题(图文)_第5张图片

输入123456789

关于VS2017使用scanf报错的问题(图文)_第6张图片

出错!

②用scanf_s输入:

关于VS2017使用scanf报错的问题(图文)_第7张图片

关于VS2017使用scanf报错的问题(图文)_第8张图片

同样输入123456789,因为scanf_s函数中的最后一个参数限制了读取个数,所以这次输入并不计入,自然也不会出现错误。

特别注意:在此例中,输入的字符数超过5个(包括5个)都会导致程序出错或是不计入,因为字符数组最后一个s1[4]默认为字符串的结束标志‘\0’。






你可能感兴趣的:(编译器使用问题)