#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; } |