안녕하세요. printf(const char *format, ...) 만을 구현하면 다음과 같습니다.
int printf(const char* format, ...)
{
char *buf;
va_list args;
int i;
buf = (char*) malloc(256);
va_start(args, format);
i=vsprintf(buf,format,args);
va_end(args);
putstr(buf);
free(buf);
return i;
}
여기서 중요한 건 va_start, args, va_end 그리고 vsprintf입니다.
va_start의 파라미터로 args와 format을 줍니다. 그러면 args가 format 다음부터의 ... 에 해당하는 파라미터들을 가리키게 됩니다. va_end 는 args를 해제하는 함수입니다.
vsprintf에 마지막 파라미터로 args가 넘어갑니다. 이제 vsprintf를 구현해야 합니다.
vsprintf의 형식은 다음과 같습니다.
int vsprintf(char *buffer, const char *format, va_list args);
이제 이 vsprintf 함수 내에서 format 문자열을 한글자씩 읽어 %d, %s 등이 나오면 va_arg()를 이용해 하나씩 ... 에 해당하는 파라미터들을 꺼내 대체해 주시면 됩니다. 참고로 va_arg(args, int)처럼 int를 입력해주면 ...에 들어오는 파라미터를 integer형으로 돌려주며 char를 넣으면 char형으로 인식해 돌려줍니다.
다음으로 테스트 해보세요.
void testfunc(char *format, ...)
{
va_list args;
va_start(args, format);
printf("%d\n", va_arg(args, int));
printf("%d\n", va_arg(args, int));
va_end(args);
}
testfunc("test", 1, 2); 이렇게 이 함수를 호출하면 1, 2가 차례대로 출력될것입니다.
워니 님이 쓰신 글 :
:
: 학교에서 my_printf() 함수를 만들어야 하거든요~~
: 그래서 참고 할려구요~~
: 좋은 하루 되세요~~
|