StringPrintf: A Typesafe printf Family for C++
By Stefan Woerthmuller, August 01, 2005
You can use StringPrintf, a typesafe version of the printf function family, with std::string and C strings.
August, 2005: StringPrintf: A Typesafe printf Family for C++
Listing 1
int main()
{ string s1;
const short i1 = -12;
const unsigned short u1 = 23;
const float f1 = 3572.24f;
const double d1 = -237E-12;
const char * cp1 = "submarine";
// printf-style function
// correct string and output
StringPrintfCout("int = %d%%; float = %3.1f\n\n", i1, f1);
// Outputs: "int = -12%; float = 3572.2"
// Use Wrong Types
StringPrintfCout("string = %s; int = %3d\n\n", f1, i1);
// Outputs: "string = 3572.247070; int = -12"
// sprintf-style function
// Too few Arguments
StringPrintf(s1, "string = %s; int = %3d, %s, %d, %s", f1, d1);
cout << s1 << "\n\n";
// Outputs: "string = 3572.247070; int = -0.000000, %s, %d, %s"
// Too many Arguments
StringPrintf(s1, "string = %s; int = %3d", cp1, f1, d1, u1);
cout << s1 << "\n\n";
// Outputs: "string = submarine; int = 3572.247070"
// User defined Type
myUserClass User1;
StringPrintf(s1, "User1 = %s", User1);
cout << s1 << "\n\n";
// Outputs: "User1 = userClassValue"
// fprintf-style function
FILE *file;
if(file = fopen("test.txt", "w"))
{
StringPrintf(file, "string = %f; int = %3d\n", f1, i1);
// Outputs to file: "string = 3572.239990; int = -0.000000"
fclose(file);
}
// Dangerous! sprintf-style buffer overflow possible
char buff[100];
StringPrintfCout("int = %d%%; float = %3.1f\n\n", i1, f1);
// Outputs: "int = -12%; float = 3572.2"
// snprintf-style function using buffer length parameter
#define BUFFLEN 24
char tx[BUFFLEN];
StringPrintf(tx,BUFFLEN,"String = %s; float = %f,double = %f",cp1,f1,d1);
tx[BUFFLEN - 1] = 0;
cout << tx << "\n\n";
// Outputs: "String = submarine; flo"
return 0;
}