// TestSprintF.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
int sprintf_with_args (char* buf, char* format, void** args)
{
char* start;
char field_format[32];
char* field;
char* field_type;
int result;
start = buf;
while( *format )
{
if( *format != '%' )
{
*buf++ = *format++;
continue;
}
field = field_format;
field_type = 0;
*field++ = *format++;
while( *format && !field_type && field<field_format+32)
{
switch (*format)
{
case '%':
case 'c'://int
case 'C':
case 'd':
case 'i':
case 'o':
case 'u':
case 'x':
case 'X':
case 'e':
case 'E'://double
case 'f':
case 'g':
case 'G':
case 'a':
case 'A':
case 'n'://int*
case 'p'://void*
case 's'://char*
case 'S'://wchar_t*
field_type = format;
break;
}
*field++ = *format++;
}
if (field_type)
{
*field = 0;
#pragma warning( push )
#pragma warning( disable: 4996 )
switch (*field_type)
{
case '%':
*buf++ = '%';
break;
case 'c'://int
case 'C':
case 'd':
case 'i':
case 'o':
case 'u':
case 'x':
case 'X':
result = sprintf (buf, field_format, *((int*)(*args)));
if (result>0)
{
buf+=result;
}
else
{
return -1;
}
args++;
break;
case 'e':
case 'E'://double
case 'f':
case 'g':
case 'G':
case 'a':
case 'A':
result = sprintf (buf, field_format, *((double*)(*args)));
if (result>0)
{
buf+=result;
}
else
{
return -1;
}
args++;
break;
case 'n'://int*
case 'p'://void*
case 's'://char*
case 'S'://wchar_t*
result = sprintf (buf, field_format, *((int**)(*args)));
if (result>0)
{
buf+=result;
}
else
{
return -1;
}
args++;
break;
}
}
#pragma warning( pop )
}
*buf = '\0';
return (int)(buf-start);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* pFormatString = "문자열%%[%d][%d][%5d] [%s] [%x] [%e][%.03f]메%q세지 \r\n";
char szMessage[256];
void* pParameters[7];
int Parameters[32];
char param1 = 100;
short param2 = 101;
int param3 = 102;
char* param4 = "xxx";
int param5 = -1;
double param6 = 0.1;
double param7 = 0.5;
Parameters[0] = (int)param1;
Parameters[1] = (int)param2;
Parameters[2] = (int)param3;
Parameters[3] = (int)param4;
Parameters[4] = (int)param5;
memcpy (&Parameters[5], ¶m6, sizeof(double));
memcpy (&Parameters[7], ¶m7, sizeof(double));
#if 0
pParameters[0] = &Parameters[0];
pParameters[1] = &Parameters[1];
pParameters[2] = &Parameters[2];
pParameters[3] = &Parameters[3];
pParameters[4] = &Parameters[4];
pParameters[5] = &Parameters[5];
pParameters[6] = &Parameters[7];
#else
pParameters[0] = ¶m1;
pParameters[1] = ¶m2;
pParameters[2] = ¶m3;
pParameters[3] = ¶m4;
pParameters[4] = ¶m5;
pParameters[5] = ¶m6;
pParameters[6] = ¶m7;
#endif
sprintf_with_args (szMessage, pFormatString, pParameters);
printf (szMessage);
return 0;
}