我正在寻找用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"
怎么办?
答案 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);
这样的东西应该有效
并将提供更简单的迁移路径。虽然存在差异。