Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-17 00:00
관리 메뉴

nomad-programmer

[Programming/C] printf() 함수와 비슷한 가변인자 함수 만들기 본문

Programming/C

[Programming/C] printf() 함수와 비슷한 가변인자 함수 만들기

scii 2021. 1. 17. 17:04

가변 인자가 특정 자료형이 아닌 여러 자료형이 전달된다면 첫 번째 인자에 인자의 개수와 자료형의 정보까지도 전달해야 한다. 그래서 printf()와 같은 함수는 첫 번째 인자를 문자열로 만들고 '%c, %d, %s' 등을 사용하여 자료형과 인자의 개수를 전달한다.

'%c' 이면 문자를 인자로 전달하고, '%d' 이면 정수를 인자로 전달하고, '%s' 이면 문자열의 시작 주소를 인자로 전달한다.

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

void MiniPrintf(char *fmt, ...){
    int i = 0;
    va_list ap;
    va_start(ap, fmt);
    
    while(fmt[i] != '\0'){
        if(fmt[i] != '%'){
            putchar(fmt[i]);
        }
        else{
            switch(fmt[++i]){
                case 'c':
                    printf("%c", va_arg(ap, char));
                    break;
                case 'd':
                    printf("%d", va_arg(ap, int));
                    break;
                case 's':
                    printf("%s", va_arg(ap, char*));
                    break;
                default:
                    puts("wrong type...");
            }
        }
        i++;
    }
    va_end(ap);
}

int main(int argc, const char * argv[]) {
    char c = 'a';
    char* str = "abc";
    int a = 10, b = 20;
    
    MiniPrintf("%d + %d = %d\n", a, b, a + b);
    MiniPrintf("%s = abc\n", str);
    MiniPrintf("%c%c%c\n", c, c, c);

    return 0;
}

/* 결과
10 + 20 = 30
abc = abc
aaa
*/

fmt는 문자열의 시작 주소를 저장하고 ap는 두 번째 인자의 주소를 저장하여 MiniPrintf() 함수를 시작한다. fmt 문자열 중 '%' 문자가 나오면 다음 문자가 'c', 'd', 's' 인지를 판단하여 'c' 문자이면 ap 주소를 이용하여 문자를 읽고 'd' 문자이면 ap 주소를 이용하여 정수를 읽고 's' 문자이면 문자열의 주소를 읽는다.

Comments