在c ++中使用sscanf和sprintf

时间:2012-08-30 05:12:35

标签: c++ c styles

如果您认为在主要使用c ++的程序中使用这些函数是可以接受的,那么我想知道事物的风格方面。我问,因为我有一位教授教授一个c ++类,其中的例子充满了c-strings,字符串到c-string转换,sscanf,sprintf和其他类似的东西。

1 个答案:

答案 0 :(得分:2)

嗯,这里有一些关于一般流与stdio问题的几点可以帮助你做出决定。大多数适用于stringstream vs sprintf / sscanf;一些仅涉及缓冲的非内存流(例如文件,stdin / stdout)。

  • 流是类型安全的,所以如果你的程序编译它通常会运行正常,而stdio格式字符串与参数和类型的匹配容易出错,编译器不需要验证它(尽管有些可以)
  • 如果您最终混合使用它们,则需要使用流中的sync_with_stdio成员(http://www.cplusplus.com/reference/iostream/ios_base/sync_with_stdio/) - 这可能会降低速度他们失落了
  • 标准C版本scanfprintf等不允许自定义支持您创建的新类型,这极大地限制了您并且无法创建和使用多态代码(例如模板,宏)打印不同的类型
    • 像GNU这样的一些实现确实有一些自定义功能
  • printf / scanf样式格式字符串可以比C ++流更简洁 - 特别是在使用iomanip时 - 但更多地依赖于熟悉性以便于阅读
  • 大多数第三方C ++代码只会附带流媒体功能
  • 在实践中,printf / scanf通常更快,尽管需要将运行时切换到特定于类型的处理,但这需要付出代价:它们缺少某些流功能,例如特定于语言环境的行为,贯穿电话的行为等等。
  • printf / scanf等有时可用于根据指定格式字符串的配置来改变运行时I / O解析(对于像GNU这样允许引用参数的扩展,这更容易使用数字来表示它们在参数列表中的位置,而不是必须使格式字符串和参数对应);仍然,这是脆弱的(错误经常使程序崩溃)和 - 经常尝试使用国际化 - 不如专门为此目的设计的设施能力