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