【发布时间】:2014-06-01 03:59:45
【问题描述】:
C 中的scanf 和scanf_s 有什么区别。我使用的是Visual Studio 13,当我尝试使用scanf 时它不断给我错误。
【问题讨论】:
-
也许您应该编辑您的问题并添加一些代码来显示您如何使用 scanf() 以及相关的错误?
-
这是一个让你烦恼的微软“扩展”
标签: c
C 中的scanf 和scanf_s 有什么区别。我使用的是Visual Studio 13,当我尝试使用scanf 时它不断给我错误。
【问题讨论】:
标签: c
两者都从标准输入流中读取格式化数据。 “_s”是微软的“安全”版本。
这些版本的 scanf、_scanf_l、wscanf、_wscanf_l 具有安全性 增强功能,如Security Features in the CRT 中所述:
许多旧的 CRT 函数都有更新、更安全的版本。如果一个安全的 功能存在,旧的,安全性较低的版本被标记为 已弃用,新版本具有 _s(“安全”)后缀。
在这种情况下,“弃用”只是意味着函数的使用不是 受到推崇的;它并不表示该功能被安排在 从 CRT 中删除。
安全功能不能防止或纠正安全错误; 相反,它们会在错误发生时捕获错误。他们执行额外的 检查错误条件,并在发生错误的情况下调用 错误处理程序(请参阅参数验证)。
例如,strcpy 函数无法判断字符串是否 它正在复制的目标缓冲区太大。 但是,它的 安全对应方 strcpy_s 将缓冲区的大小作为 参数,因此它可以确定是否会发生缓冲区溢出。如果你 使用 strcpy_s 将 11 个字符复制到 10 个字符的缓冲区中, 这是您的错误; strcpy_s 无法纠正你的错误, 但它可以检测到您的错误并通过调用无效通知您 参数处理程序。
【讨论】:
scanf_s() 在附录 B(信息部分)和 K(规范)的 C11 规范中。