Visual Studio中scanf函数报错的几种解决方法

 更新时间:2025年03月19日 09:18:05   作者:Gyongshu  
本文主要介绍了Visual Studio中scanf函数报错的几种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一.选择VS的原因

俗话说:“工欲善其事必先利其器”,有一个好的工具往往可以极大的帮助我们更好的去解决我们的事情。VS是(Visual Studio)的缩写,它是微软公司旗下的一种全面的集成开发环境 (IDE)。我们知道C语⾔是⼀⻔编译型的计算机语⾔,需要依赖编译器将计算机语⾔转换成机器能够执⾏的机器指令;所以在学习工具上的选择还是比较重要的。VS里集成了msvc编译器,集代码编写功能、分析功能、编译功能、调试功能等诸多功能于一体。我选择的是vs2022的版本,下面我来讲讲缘由:

优点:

  • 免费!VS为个人用户提供了免费的社区版本,可以减少学习成本。
  • VS是主流的集成开发环境,背靠大厂软件的维护这些的都较好;并且在企业中使⽤也较为普遍。
  • 对新手友好,不用自己去搭建环境,直接安装即可使⽤,基本不⽤额外配置环境;并且默认界面是中文的。
  • VS包含了编辑器+编译器+调试器,功能强⼤;并且可以调整我们写出的代码格式,有助于我们养成写出好看的代码格式。

缺点:

  • 功能丰富导致安装包较大,比较占用内存。

鱼与熊掌不能兼得,所有东西都会有自己的缺点;我们在权衡利弊之后能够接受他的缺点,那我们便可以大胆的去选择他!

二.scanf函数报错的原因

几乎在所有的VS版本中,在使用scanf这个函数时都会报错;那为什么会报错呢?报的是一个什么样的错误呢?下面我们一块来看看:

我们在VS中正常使用scanf这个函数时几乎会都会出现这么一个错误:

那究竟是为什么呢?我们把这个报错的信息拿出来看看:

这个大概的意思呢是:VS觉得scanf这个函数可能不安全,让我们考虑使用scanf_s这个函数,如果要弃用这个警告,让我们需要使用(_CRT_SECURE_NO_WARNINGS)。这样一看,那解决这个错误的方法就有两种了。后面再给大家讲这两种方法,这里我们先来看看VS为什么会觉得scanf这个函数不安全。

scanf函数在使用%s这个占位符的时候呢,可能会存在潜在问题;scanf函数在将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。在储存字符串时, 很可能会超过数组的边界,这将会导致预想不到的结果。

我们发现虽然输出了我们从键盘输入的内容,但是又报了另外的错误;那么这个又是什么错误呢?这是一个调试错误,告诉我们说运行时检查失败了,这个变量“ch”周围的堆栈以损坏。那原因又是什么呢?其实就是储存这个字符串的时候超过了数组设定的边界,ch数组只能储存5个字符,而我们输入了7个字符;超过了这个边界造成了堆栈的损坏。由于scanf函数默认不会检测字符串是否超过了数组⻓度,所以VS认为scanf这个函数可能会不安全,存在有潜在的隐患。

三.解决方法

1.采用scanf_s函数(不建议!)

为什么不建议使用scanf_s这个函数呢?因为这个scanf_s这个函数的使用方式跟scanf函数不完全一致,如果不了解scanf_s这个函数就使用可能会导致出现更多的错误!如果想使用scanf_s函数就需要去了解好这个函数具体的使用方法,这里并不是直接将scanf改成scanf_s就完事了。直接改成scanf_s或许可以解决当前的问题,但并不能代表可以解决后面遇到的其他问题,这就会存在潜在的问题;并且使用scanf_s后可能会导致你的代码放到其他编译器下编译不过去的问题。综上所以这里不建议大家采用这种方法。

2.一劳永逸的方法

VS给的建议里面还有另外一种方法,就是使用这个(_CRT_SECURE_NO_WARNINGS),那这个该怎样来用呢?这里需要用到#define;是用来定义符号用的。

我们只需要将(#define _CRT_SECURE_NO_WARNINGS)写在我们创建的源文件(.c文件和.cpp文件)的第一行就能解决这个问题。

这样即可!

那么这样不是每次都得要在第一行加上这个里面?说好的一劳永逸的办法呢?不用着急,接下来就给大家讲这个一劳永逸的办法!其实我们创建源文是从一个叫(newc++file.cpp)这个文件拷贝过来的我们只需要找到这个文件,用记事本打开它,并在里面加上 #define_CRT_SECURE_NO_WARNINGS 这句话,然后保存即可达到一劳永逸的目的。具体步奏我们仔细来看看:

  • 首先我们找到newc++file.cpp这个文件,这里给大家推荐一个软件叫Everthing,是一个用来找文件用的软件,可以帮我们快速找到需要的文件,大家在找的时候记得一定要认准官网,这是个免费的软件,如找的需要付费的就是找错了建议卸载了重新再找!(如果电脑里装了多个版本的VS的软件,记得一定要选择对应版本的newc++file.cpp文件

  • 然后我们复制一份到放到桌面,为什么要放到桌面呢?直接在这里打开加上这句话不可以吗?如果直接在这里加会保存不了;因为权限不够,桌面的权限更高放在桌面去添加这句话便能正常保存!

  • 然后我们在使用记事本打开newc++file.cpp这个文件,里面应该是空白的;我们把#define _CRT_SECURE_NO_WARNINGS这句话加进去,记得点保存。然后我们在从桌面复制这个文件到我们在开始找到newc++file.cpp这个文件的位置;在这里替换掉这个newc++file.cpp文件。就成功完成了!

  • 注意事项切记不能弄丢了newc++file.cpp这个文件!否则会在创建源文件时没有C++文件(.cpp)这个选项

就是会没有这个选项:

  • 并且我们在创建源文件时需要不能在紧凑视图界面里创建源文件,否则也不能到的我们需要的需求。

紧凑视图为这样:(不能在此创建源文件,不然达不到我们需要的效果)

需要在这个界面中新建源文件才能达到效果:

到这里就完啦!你学会了这个方法吗?如果有正在被这个问题困扰的朋友可以去试试,保证真实有效哦。

到此这篇关于Visual Studio中scanf函数报错的几种解决方法的文章就介绍到这了,更多相关Visual Studio scanf函数报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C++ 构造双向链表的实现代码

    C++ 构造双向链表的实现代码

    本篇文章是对C++中构造双向链表的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Qt 使用Poppler实现pdf阅读器的示例代码

    Qt 使用Poppler实现pdf阅读器的示例代码

    下面小编就为大家分享一篇Qt 使用Poppler实现pdf阅读器的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 将 C++ 类型属性暴露给 QML

    将 C++ 类型属性暴露给 QML

    这篇文章主要介绍了将 C++ 类型属性暴露给 QML, QML 是一种基于 JavaScript 的声明式语言。在 Qt5中,QML有了长足进步,并且同 C++ 并列成为 Qt 的首选编程语言下面一起进入文章学习 QML的条件下也看看如何将将 C++ 类型属性暴露给 QML,需要的朋友可以参考一下
    2021-12-12
  • C/C++产生随机数函数简单介绍

    C/C++产生随机数函数简单介绍

    这篇文章主要为大家详细介绍了C/C++产生随机数函数的实现方法,如何使用C/C++产生随机数函数,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • C++ const关键字分析详解

    C++ const关键字分析详解

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性。这篇文章主要介绍了C/C++ 中const关键字的用法,需要的朋友可以参考下
    2021-08-08
  • C++如何获取系统信息 C++获取IP地址、硬件信息等

    C++如何获取系统信息 C++获取IP地址、硬件信息等

    这篇文章主要为大家详细介绍了C++如何获取系统信,C++获取IP地址、硬件信息等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 用C语言实现计算器功能

    用C语言实现计算器功能

    这篇文章主要为大家详细介绍了用C语言实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 利用C语言实现n字棋游戏

    利用C语言实现n字棋游戏

    本文将利用C语言编写一个n字棋游戏,和井字棋一样,不过这个游戏你可以自定义棋盘的大小。文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-05-05
  • C++ 反射机制详解及实例代码

    C++ 反射机制详解及实例代码

    这篇文章主要介绍了C++ 反射机制详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • 浅析string类字符串和C风格字符串之间的区别

    浅析string类字符串和C风格字符串之间的区别

    string类是标准库的类,并不是内置类型,标准库就像是我们自己定义的类差不多的,string类型对象没有标配'\0'结尾的
    2013-09-09

最新评论