C++ 如何向iostream发送格式字符串?
可能重复:C++ 如何向iostream发送格式字符串?,c++,iostream,format-string,C++,Iostream,Format String,可能重复: 我可以使用一个像Prtrf那样的格式字符串来使用C++ IOString类吗?p> 基本上,我希望能够做到以下几点: snprintf (inchars, len, "%4f %6.2f %3d \n", float1, float2, int1); 轻松使用stringstreams。有没有一个简单的方法可以做到这一点 是的,有(内部为stringstreams) #包括 #包括 int main(){ Std::CUT> P>这种格式需要使用标准的C++流来做更多的努力。特
我可以使用一个像Prtrf那样的格式字符串来使用C++ IOString类吗?p> 基本上,我希望能够做到以下几点:
snprintf (inchars, len, "%4f %6.2f %3d \n", float1, float2, int1);
轻松使用stringstreams。有没有一个简单的方法可以做到这一点 是的,有(内部为stringstreams)
#包括
#包括
int main(){
Std::CUT> P>这种格式需要使用标准的C++流来做更多的努力。特别是,你必须使用它来指定小数点后显示的数字的数量。 < P>你可以编写一个包装函数,它返回一些可以传递到OSTRIGHEW流中的东西。
该功能结合了MooEEEP中提出的一些解决方案,并在评论中指出:
std::string string_format(const char *fmt, ...) {
std::vector<char> str(100);
va_list ap;
while (1) {
va_start(ap, fmt);
int n = vsnprintf(&str[0], str.size(), fmt, ap);
va_end(ap);
if (n > -1 && n < str.size()) {
str.resize(n);
return &str[0];
}
str.resize(str.size() * 2);
}
}
std::字符串格式(const char*fmt,…){
std::载体str(100);
va_列表ap;
而(1){
va_启动(ap、fmt);
int n=vsnprintf(&str[0],str.size(),fmt,ap);
va_端(ap);
如果(n>-1&&n 标准C++格式更冗长,很遗憾。你会想要一个库。哇,多么可怕的语法……看起来它会起作用……虽然我会坚持一段时间,希望能用更干净的语法来解决更好的问题。你习惯了……但是,很少有这样的情况,你会因为操作符优先而麻烦。%
的使用可能是受Pythonice启发的。这里有一个链接可以使用:我刚刚发现了这种方法的一个缺点:当你传入一个与提供的参数不匹配的格式字符串时,你会得到一些非特定的错误,从打印垃圾到分段错误。boost::format提供了一个有用的错误改为r消息。请参见:@moooeeep:GCC提供了一个扩展属性,该属性将警告与printf参数不匹配的参数(\uuuuu-attribute\uuuu((格式(…)))
)。
std::string string_format(const char *fmt, ...) {
std::vector<char> str(100);
va_list ap;
while (1) {
va_start(ap, fmt);
int n = vsnprintf(&str[0], str.size(), fmt, ap);
va_end(ap);
if (n > -1 && n < str.size()) {
str.resize(n);
return &str[0];
}
str.resize(str.size() * 2);
}
}