Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[3257] Re:printf() 함수의 소스코드 구할수 없을까요???
Starlet [starlet5] 9398 읽음    2004-03-11 20:29
안녕하세요. 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() 함수를 만들어야 하거든요~~
:  그래서 참고 할려구요~~
:  좋은 하루 되세요~~

+ -

관련 글 리스트
3256 printf() 함수의 소스코드 구할수 없을까요??? 워니 2313 2004/03/11
4376     Re:printf() 함수의 소스코드 구할수 없을까요??? 조준회 3444 2004/03/11
3257     Re:printf() 함수의 소스코드 구할수 없을까요??? Starlet 9398 2004/03/11
3259         Re:Re:감사합니다... 한가지 더 어쭤 보겠습니다.... 워니 2636 2004/03/12
3260             Re:Re:Re:감사합니다... 한가지 더 어쭤 보겠습니다.... Starlet 2944 2004/03/12
3265                 Re:Re:Re:Re:감사합니다.. 도움 많이 됐습니다.. 님.. 행복하세요~~ *냉무) 워니 2273 2004/03/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.