sprintf和char []与字符串

1 c c++

我需要传递const char *给一个函数.在我通过它之前,我通常需要从一些变量构建它.我永远无法决定哪种方法更优雅,整体更好:

  • 分配一个足够长的数组以适合文本,并用于sprintf构建最终变量并将其传递给函数.
  • s使用+运算符(并置)使用变量初始化字符串,然后使用传递给函数s.c_str().

使用数组的缺点:可能不适合整个文本.
亲:快.

使用字符串的缺点:我不需要担心内存管理,易于构建.亲:慢.

我的第二个问题是:你通常如何从其他变量字符串构建一个完整的字符串?

Tim*_*sch 14

除非它绝对性能至关重要,否则我倾向于使用std :: stringstream从其组件构建字符串,然后使用c_str()生成字符串.这是安全的,因为这种方式不存在缓冲区溢出的可能性,并且通常足够快.

如果分析器告诉我构建字符串是一个热点,那么你将不得不交换一些安全性以获得速度并开始使用类似sprintf的东西,但我宁愿避免这种情况.总的来说,我将此作为最后的手段.

  • snprintf仍然非常不安全,即使缓冲区溢出没有问题.坚持使用stringstream,或者至少是字符串.如果在对代码进行概要分析后发现这是一个瓶颈,您可以稍后进行优化. (6认同)
  • snprintf不安全.它确保防止缓冲区溢出,但它不能确保类型安全. (3认同)
  • 您不必交易安全,因为您可以使用snprintf而不是sprintf. (2认同)

Joh*_*itb 10

这听起来像Herb Sutter的优秀文章The Manor Formatters of Manor Farm.

为了记录:我自己使用std::ostringstream,建立字符串并通过oss.str().c_str().