가변인자함수에 대하여 공부하면서 가변함수의 대표예시인 printf를 구현해보았습니다.
출력하는 부분은 printf 내부쪽을 알아야되기에 일단 printf함수를 이용했습니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 |
#include<stdio.h>
#include<stdarg.h>
int my_printf(char* str,...)
{
int len=0;
int i;
char buf[256];
va_list ap;
va_start(ap,str);
for(;*str;str++,len++)
{
if(*str=='%')
{
switch(*(str+1))
{
case 'c' : //문자
printf("%c",va_arg(ap,int));
break;
case 's' : //문자열
printf("%s",ap);
va_arg(ap,int);
break;
case 'd' : //정수
printf("%d",va_arg(ap,int));
break;
case 'x' : //16진수
printf("%x",va_arg(ap,int));
break;
case 'f' : //실수
printf("%f",va_arg(ap,double));
break;
default :
str--;
len--;
break;
}
str++;
len++;
}
else if(*str==92) //92는 역슬래쉬
{
switch(*(str+1))
{
case 'n' : //줄넘김
printf("\n");
str++;
len++;
break;
default :
break;
}
}
else
{
printf("%c",*str);
}
}
va_end(ap);
return len;
}
int main()
{
my_printf(" %d\n",my_printf("%d %d %c %s %c %f",1,2,'c','test','c',0.1));
my_printf("%d %x %x %x",3);
printf("%d",printf("asdf%d",1));
} |
cs |
하면서 의문이 들었던게 va_arg()매크로함수의 2번째인자값에 char을 넣을 수 없다는 것이였습니다.
[va_arg는 ap의 포인터를 다음 인자로 옮겨주는 역할을 합니다.]
스택이 무조건 4byte씩 쌓인다면 모를까 char형은 1byte씩 쌓인다고 생각했기 때문에 char형이 필요하지 않냐고 생각했는데
알아보니 char이나 short는 인자로 전달될때 스택에서 int 형으로 확장되어서 전달되기 때문에 두번째 인자의 값이 int, double만 사용되는 것이였습니다. 또 va_list 는 char형인데 이는 포인터를 이동시킬때 1byte씩 이동시키기 위함이라고 하네요.
'『프로그래밍』 > C' 카테고리의 다른 글
뱀게임 (1) | 2017.12.27 |
---|---|
전역변수명과 지역변수명이 같을때 (0) | 2017.12.21 |
조건부 컴파일 (0) | 2017.12.20 |