首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取代snprintf(3)的C++习惯用法是什么?

取代snprintf(3)的C++习惯用法是什么?
EN

Stack Overflow用户
提问于 2011-05-01 16:58:39
回答 5查看 6.6K关注 0票数 4

我有一些C++代码,它需要在解析某个文件头失败时生成错误消息。在这种情况下,我需要确保报头中的某个4字节字段为"OggS",如果不是,则返回错误消息,如"invalid capture_pattern:'FooB';expecting 'OggS'“。我的代码看起来像这样:

代码语言:javascript
复制
const string OggPage::parseHeader(void) {
  read(fd, capture_pattern, sizeof(capture_pattern)); // error handling omitted
  if (strncmp(capture_pattern, CAPTURE_PATTERN, sizeof(capture_pattern)) != 0) {
    char err[256];
    snprintf(err, sizeof(err), "Failed to read %d bytes from file descriptor %d: %s\n", sizeof(capture_pattern), fd, err);
    return err;
  }

  return "Everything was A-OK!";
}

从其他数据类型构建字符串的标准C++习惯用法是什么?我并不执着于这里的printf(3)-style格式,所以请随意提出任何可行的建议。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-01 17:03:25

您可以使用C++标准库中的stringstreamostringstream。如果进一步的流不会被用来从其中读取值(例如,不会使用它的istream部分),ostringstream更合适。

代码语言:javascript
复制
#include <sstream>
#include <string>
#include <iostream>

int main() {
 std::stringstream str_stream;
 int number = 5;

 str_stream << " String with number " << number << std::endl;;

 std::string str = str_stream.str();
 std::cout << str; 
}
票数 5
EN

Stack Overflow用户

发布于 2011-05-01 17:03:22

实现这一点的C++方法是std::stringstream

代码语言:javascript
复制
std::stringstream err;
err << "Failed to read " << sizeof(capture_pattern)
                         << " bytes from fd " << fd << std::endl;
return err.str();
票数 1
EN

Stack Overflow用户

发布于 2011-05-01 17:03:35

cstring中使用字符串函数对于阅读来说无疑是很好的。它们快速、方便,而且不冗长。

为了构建您的错误消息,您可以使用stringstream、与string类相关的运算符、boost::format或您所说的snprintf

您还可以使用boost::lexical_cast来处理简单的事情:

代码语言:javascript
复制
string message = "Failed to read " + lexical_cast<string>(n) +
   " bytes from the descriptor " + lexical_cast<string>(fd) + ".";

我建议从理智的角度看一看this Gotw

如果你有很多格式化工作要做,我推荐你使用boost::format。对于简单的孤立事物使用lexical_cast,如果您有需要,请使用stringstream (例如,自定义operator<<,不能使用boost等)。

老实说,snprintf真的很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5847480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档