2

我正在寻找用字符串流替换一些 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);

返回相同的字符串?

那么 forint"%d"or double"%f"呢?

4

3 回答 3

2

是的。但这是一个很长的故事:iostreams 格式化通过流的编解码器的格式化方面起作用。细节相当复杂;参见 C++11 27.7。默认 facet 的转换sprintf用于输入格式和strtoull-type 函数用于输出;详见 22.4.2.1。

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

于 2012-10-11T16:21:04.283 回答
1

在标准中,C++ 格式化是根据 printf 格式说明符定义的,因此您可以非常确定简单的格式化程序也能正常工作。但是,有些事情 iostream 不支持(反之亦然):"% d"例如,没有 iostream 等效项,并且在输出字符串时会忽略精度规范(可能是因为 iostream 不知道该字符串是否是格式字符串的一部分,或对应于"%s")。

另外,不要忘记除了宽度之外的所有格式选项都是粘性的;您应该保存它们,并在格式化需要它们的元素时恢复它们。

于 2012-10-11T16:24:36.577 回答
0

假设对于那种情况,答案是肯定的,我不相信它在所有情况下都是一样的,尤其是在使所有对齐正确的情况下。

你考虑过 Boost::format吗?

类似的东西return boost::str(boost::format("%ld") % l);应该可以工作,并且会提供更容易的迁移路径。尽管确实存在差异。

于 2012-10-11T16:11:54.383 回答