【问题标题】:why scanf is safer than getchar? [duplicate]为什么scanf比getchar更安全? [复制]
【发布时间】:2012-12-28 08:56:26
【问题描述】:

可能重复:
getc Vs getchar Vs Scanf for reading a character from stdin

我知道 getchar 是一个 ,它将字符作为输入来自标准输入。
其中 scanf 是一个函数,它将任何数据类型作为标准输入的输入

因为 getchar 是一个宏为什么它有助于使程序运行得更快,但尽管如此,建议使用 scanf 代替 getchar为什么?

我在网上了解到,与 getchar 相比,scanf 是安全的,那么,是什么让 scanf 安全

【问题讨论】:

  • @iota - 实际上我期待与安全问题相关的答案.. - 源代码
  • 我真的不认为 scanf 是一个“安全”的功能。这是来自采访的东西还是类似的东西?编写自己的安全输入函数并不容易,但如果你这样做了,getchar 肯定是你会使用的函数之一[或 fetgc(),这就是 getchar() 最终调用的函数]。
  • 但是如果一个人接受用户的整行,那么在这种情况下最好 - getchar 还是 scanf? - 源代码

标签: c


【解决方案1】:

我认为两者都可以像你制作的那样安全或不安全,但最终我还是会选择使用scanf()

  • 由于它在每次调用时处理多个字符,scanf()可能更快。

  • 它的行为有据可查,这意味着有完善的方法可以避免安全问题,例如在格式字符串中包含硬编码长度限制,当然从不使用从用户输入生成的格式字符串.

  • scanf() 更容易使用 - getchar() 本身可能“更安全”,但您必须围绕它编写大量代码才能获得一些实际的功能。将复制scanf() 提供的功能的代码,然后必须审查安全隐患。 scanf() 的实现可能会经过广泛的同行评审,而您自己的代码可能永远也不会这样做。

  • 使用标准函数(例如 scanf())的代码比任何基于自定义库的代码更容易维护,尤其是在人员流动较大的编程团队中。

【讨论】:

  • 非常糟糕的建议。对于任何考虑使用scanf的人,请先阅读:gidnetwork.com/b-59.html
  • @mvp:我想最后它会回到实际的上下文中。例如。你会相信不能使用scanf() 的人,他们应该以正确的方式编写自己的字符串解析代码吗?在使用getchar() 基本上重新发明轮子时,我看到了无法形容的暴行......
【解决方案2】:

scanf 速度更快,因为它可以一次读取多个字符。

但是,getchar 更安全,因为它一次只能读取一个字符。如果未检查输入,则为relatively easy to exploit 程序正在使用scanf

【讨论】:

  • scanf 是否比 getchar 快当然取决于用例和实际实现。
【解决方案3】:

getChar()是我所知道和读到的函数,虽然被一些网站称为宏,但在官方 C++ Reference website.中明确称为函数

getchar() 用于需要从键盘输入一个且仅一个字符,而 scanf() 用于获取多个字符。哪个更快,完全取决于您的要求和实施。

就安全性和易用性而言,我会投票给 scanf(),因为我可以输入多个字符,并且在使用 scanf() 后我不必使用 flush(),这有时会变成使用 getchar() 时强制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 2012-09-02
    • 2021-07-05
    • 2015-05-06
    • 2021-07-14
    • 2023-03-28
    相关资源
    最近更新 更多