默认的字符串流格式是否与snprintf相同?

时间:2012-10-11 16:04:16

标签: c++ string-formatting stringstream printf

我正在寻找用stringstreams替换一些snprintf调用。我需要确保输出相同。

给出long l = some_input_var;

std::ostringstream str;
str << l;
return str.str();

buf str[24];
snprintf(str, 24, "%ld", l);
return std::string(str);

返回相同的字符串?

int"%d"double"%f"怎么办?

3 个答案:

答案 0 :(得分:2)

是。但这是一个很长的故事:iostreams格式化工作通过流的编解码器的格式化方面。细节相当复杂;见C ++ 11 27.7。默认构面的转换使用sprintf进行输入格式化,使用strtoull - 类型函数进行输出;有关详细信息,请参见22.4.2.1。

同样,新的<string>转换函数std::to_string使用默认的sprintf格式,而各种std::stoul类函数使用C库的strtoul类似函数。

答案 1 :(得分:1)

在标准中,C ++格式是根据printf格式定义的 说明符,因此您可以非常确定简单的格式化程序是否有效 相同。然而,iostream不支持的东西(和 反之亦然):例如,没有iostream等价于"% d" 输出字符串时忽略精度规范 (可能是因为iostream不知道字符串是否会成为一部分 格式字符串,或对应"%s")。

另外,不要忘记除宽度以外的所有格式选项 黏;你应该保存它们,并在格式化时恢复它们 需要它们的元素。

答案 2 :(得分:0)

我要说的是,对于这种情况,答案是肯定的,我不相信它对所有情况都是一样的,尤其是在使所有对齐正确的过程中。

您考虑过Boost::format吗?

return boost::str(boost::format("%ld") % l);这样的东西应该有效 并将提供更简单的迁移路径。虽然存在差异。