상세 컨텐츠

본문 제목

[C] printf 구현하기

C

by 메타샤워 2023. 7. 17. 18:00

본문

printf를 직접 구현해보자
printf는 매개변수의 형식에 따라 매개변수 수가 바뀌는 가변인자 함수 이다.
 
#include <stdio.h>  
#include <string.h>  
  
void myprint(const char* str, ...)  
{  
    int i;  
    int* idx  = (int*)&str;   //스택에 매개변수가 쌓일때 4byte크기로 쌓이기 때문에 int형 포인트를 설정해주었다. long으로 해도 상관 없다.4byte이기만 하면 된다.
  
  idx++;                     //현재 포인터는 str문자열의 포인터를 가리키고 있으므로 다음 매개변수를 가리키기 위해 4byte 다음 방을 가리키게 한다.
      
    while(*str != NULL)  
    {  
        if(*str == '%')  
        {  
            switch(*(str+1))  
            {  
            case 'd':     // int 형 매개변수 출력  
                printf("%d",*(int*)idx);  
                idx++;  
                str+=2;  
                break;  
            case 'c':     // char 형 매개변수 출력  
                printf("%c",*(char*)idx);  
                idx++;  
                str+=2;  
                break;  
            case 'f':     // double 형 매개변수 출력  
                printf("%f",*(double*)idx);  
                idx++;    // double 형은 8byte를 차지하기 때문에 4byte씩 2번 뛰어 넘는다.
                idx++;  
                str+=2;  
                break;  
            case 's':     // 문자열 매개변수 출력  
                printf("%s",(char*)*idx);  
                idx++;  
                str+=2;  
                break;  
            default:  
                break;  
            }  
        }  
        else  
        {  
            printf("%c",*str);  
            str++;  
        }  
          
    }  
}  
  
int main ()  
{  
    myprint("%d %c %f %s helloworld \n\n",10,'a',10.1,"abc");  
}

 

매개변수가 스택에 쌓일때 4 byte로 쌓이며 
char형은 4byte의 첫번째 1byte에 저장되고 나머지 3byte는 빈칸이 된다.
문자열은 첫번째 값의 주소가 스택에 쌓인다 실제로 문자의 데이터가 들어 있는곳은 메모리의 데이터 영역에 저장된다.
가변인수 함수를 사용하는 것은 어렵지 않다.myprintf함수의 경우 printf 함수와 마찬가지고 고정 인수인 format 문자열을 먼저 전달하고 문자열내 메타 문의 개수와 타입에 맞는 인수들을 순서대로 전달하기만 하면된다. 
그렇다면  이런 가변인수를 취할 수 있는 함수가 이 가변인수들을 읽어들이는 방법이 중요한데 관건은 자신에게 전달된 임의 타입의 인수들을 순서대로 꺼내서 정확한 값을 읽어들어야 한다. 
 
 

관련글 더보기