2012-10-11 14 views
2

我正在寻找用stringstream替换一些snprintf调用。我需要确保输出是相同的。默认的stringstream格式与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"呢?

回答

2

是的。但是这是一个很长的故事:iostreams格式化通过流的编解码器的格式化工作。细节相当涉及;请参阅C++ 11 27.7。默认构面的转换使用sprintf作为输入格式,strtoull作为输出使用;细节见22.4.2.1。

此外,同样,std::to_string使用默认sprintf格式的新<string>转换功能,以及各种std::stoul般的功能使用C库的strtoul样的功能。

0

让我们说,对于这种情况,答案是肯定的,我不会相信它在所有情况下都是一样的,特别是对于使所有对准正确的痛苦。

你觉得Boost::format

类似return boost::str(boost::format("%ld") % l);应该工作 并将提供更容易的迁移路径。尽管存在差异。

+0

在我的环境中禁止提升(不要问......) – AShelly

+0

@AShelly好吧,不要问,但我会问这个任务的最终目的是为了避免不知道你是否有大的问题分配足够的缓冲区(或将您的输出切断)。我之前已经以某种方式处理了这个问题,可能会为你工作(懒得打字,如果这样做不会有用的话) – nhed

+0

这不是问题 - 它与更多的事实有关,即海量代码库有几十个包含'intToString'类型函数的模块,一些基于snprintf,一些在stringstream上。我想巩固,但不想破坏事情。知道长度不是问题 - 它受到MAXINT或MAXLONG的限制。 – AShelly

1

在该标准中,C++格式化是根据printf格式 说明符定义的,因此您可以确定简单格式化程序的工作原理 是相同的。但是,有一些iostream不支持(反之亦然 ):例如,没有iostream相当于"% d",而 在输出字符串时忽略精度规格 (可能是因为iostream不知道是否该字符串将是格式字符串的部分 ,或对应于"%s")。

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