【问题标题】:Differences between scanf & scanf_s [duplicate]scanf和scanf_s之间的区别[重复]
【发布时间】:2014-06-01 03:59:45
【问题描述】:

C 中的scanfscanf_s 有什么区别。我使用的是Visual Studio 13,当我尝试使用scanf 时它不断给我错误。

【问题讨论】:

  • 也许您应该编辑您的问题并添加一些代码来显示您如何使用 scanf() 以及相关的错误?
  • 这是一个让你烦恼的微软“扩展”

标签: c


【解决方案1】:

两者都从标准输入流中读取格式化数据。 “_s”是微软的“安全”版本。

这些版本的 scanf、_scanf_l、wscanf、_wscanf_l 具有安全性 增强功能,如Security Features in the CRT 中所述:

许多旧的 CRT 函数都有更新、更安全的版本。如果一个安全的 功能存在,旧的,安全性较低的版本被标记为 已弃用,新版本具有 _s(“安全”)后缀

在这种情况下,“弃用”只是意味着函数的使用不是 受到推崇的;它并不表示该功能被安排在 从 CRT 中删除。

安全功能不能防止或纠正安全错误; 相反,它们会在错误发生时捕获错误。他们执行额外的 检查错误条件,并在发生错误的情况下调用 错误处理程序(请参阅参数验证)。

例如,strcpy 函数无法判断字符串是否 它正在复制的目标缓冲区太大。 但是,它的 安全对应方 strcpy_s 将缓冲区的大小作为 参数,因此它可以确定是否会发生缓冲区溢出。如果你 使用 strcpy_s 将 11 个字符复制到 10 个字符的缓冲区中, 这是您的错误; strcpy_s 无法纠正你的错误, 但它可以检测到您的错误并通过调用无效通知您 参数处理程序。

Ref

【讨论】:

  • 注意:scanf_s() 在附录 B(信息部分)和 K(规范)的 C11 规范中。
猜你喜欢
  • 1970-01-01
  • 2014-02-21
  • 2023-03-17
  • 2017-03-18
  • 2016-11-02
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多