功能没有 sprintf 那么完善就是了。
#include <cassert>
#include <cstdarg>
#include <sstream>
#include <string>
using namespace std;
string& stringprintf( string &s, const char *fmt, ... )
{
assert( s.empty() );
va_list ap;
va_start(ap, fmt);
const char *next_c; // next character
while ( *fmt != '\0' )
{
switch ( *fmt )
{
case '%':
{
next_c = fmt + 1;
switch ( *next_c )
{
case '\0':
s += *fmt;
break;
case '%':
s += '%';
++fmt;
break;
case 's':
s += va_arg(ap, char*);
++fmt;
break;
case 'd':
{
ostringstream oss;
oss << va_arg(ap, int);
s += oss.str();
++fmt;
break;
}
case 'f':
{
ostringstream oss;
oss << va_arg(ap, double);
s += oss.str();
++fmt;
break;
}
default:
assert( !"format unsupported." );
break;
}
break;
}
default:
s += *fmt;
break;
}
++fmt;
}
va_end(ap);
return s;
}
-----------------------------------------------------
测试一下
int main()
{
string s;
stringprintf(s, "int: %d, double: %f, str: %s", 18, 18.55, "test");
cout << s << endl;
}
结果如下:
int: 18, double: 18.55, str: test
本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 Antigloss 共同所有,转载请注明原作者和出处。谢谢。