// 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], &param6, sizeof(double));
 memcpy (&Parameters[7], &param7, 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] = &param1;
 pParameters[1] = &param2;
 pParameters[2] = &param3;
 pParameters[3] = &param4;
 pParameters[4] = &param5;
 pParameters[5] = &param6;
 pParameters[6] = &param7;
#endif

 sprintf_with_args (szMessage, pFormatString, pParameters);
 printf (szMessage);

 return 0;
}


 

Posted by 셈말짓기 :