0

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

4

1 回答 1

2

好吧,这里有几点关于一般流与 stdio 的问题,可以帮助您做出决定。大多数适用于stringstreamvs sprintf/ sscanf;仅在涉及缓冲的非内存流(例如文件、stdin/stdout)的情况下才使用少数。

  • 流是类型安全的,因此如果您的程序编译它通常会运行正常,而 stdio 格式字符串与参数和类型的匹配很容易出错,并且不需要编译器来验证它(尽管有些可以)
  • 如果您最终将它们混合在一起,则需要sync_with_stdio在流中使用该成员(http://www.cplusplus.com/reference/iostream/ios_base/sync_with_stdio/) - 这可能会减慢它们的速度
  • scanf等的标准 C 版本printf不允许自定义支持您创建的新类型,这是令人难以置信的限制和挫败您创建和使用打印不同类型的多态代码(例如模板、宏)
    • 像 GNU 的一些实现确实有一些自定义功能
  • printf/scanf样式格式字符串可以比 C++ 流式传输更简洁——尤其是在使用 iomanip 时——但更多地依赖于对可读性的熟悉程度
  • 大多数第三方 C++ 代码仅具有流式传输功能
  • 在实践中,尽管需要在运行时切换到特定于类型的处理,但printf/scanf通常更快,但这是有代价的:它们缺乏一些流特性,例如特定于语言环境的行为、跨调用的行为持续存在等。
  • printf/ scanfetc. 有时可用于根据配置指定格式字符串来改变运行时 I/O 解析(这对于 GNU 之类的扩展更容易,它允许您使用数字来指示参数在参数列表中的位置,而不是而不是必须让格式字符串和参数对应);尽管如此,这仍然很脆弱(错误经常使程序崩溃)并且 - 对于经常尝试使用的国际化 - 不如专门为此目的设计的设施那么强大
于 2012-08-30T05:27:56.903 回答