반응형
C언어에서 va_start, va_arg, va_copy, va_end을 사용하려면
#include <stdarg.h>
#include <stdio.h>
#include <stdarg.h>
void f(int n, ...)
{
va_list v1;
va_start(v1, n);
int a;
for (int i = 0; i < n; i++)
{
a = va_arg(v1, int);
printf("%d", a);
}
va_end(v1);
}
int main()
{
f(5, 1, 2, 3, 4, 5);
}
- int n == 몇 개 가변인자를 넘겨줄 것인가.
- 매개변수들이 넘어올 때 int형 보다 작은 범위는 int로 double 보다 작은 범위는 double로 포인터는 void*로 넘어옴
- float, char는 안 넘어감
- va = variable argument
- va_list 가변인자 리스트
- va_list(v1) → 가변인자 리스트 이름을 v1. 가변인자들을 담을 거임.
- va_start 가변인자을 사용하려면 초기화 해야하니 시작지점을 알려줌.
- va_start(v1, n) → 가변인자 시작지점 n 변수 다음.
- va_arg 가변인자들 type에 맞게 사용(타입을 지정해주는 것이 아니라 이 타입이라고 알려줘야함.)
- va_arg(v1, int); → int형이라고 알려주는 것이며, 다음 매개 변수로 넘어감.
- va_end 가변인자를 그만 사용한다는 말
- 이거 없어도 작동하지만 다른 컴파일러에서는 이게 꼭 필요하기에 꼭 적어주자.
예제들을 통해서 뭐가 넘어가고 안 넘어가는지 보쟈
#include <stdio.h>
#include <stdarg.h>
void f(int n, ...)
{
va_list v1;
va_start(v1, n);
printf("%s", va_arg(v1, char *));
printf("%c", *(va_arg(v1, char *)));
printf("%f", va_arg(v1, double));
printf("%d", va_arg(v1, int));
va_end(v1);
}
int main()
{
//포인터
char *p = "awd";
//char 형(char로 뽑을 때)
char aa = 'a';
char *p1 = &aa;
//char 형
char ch = 'c';
f(4, p, p1, 10.2, ch);
}
- 포인터형을 넘길 때
#include <stdio.h>
#include <stdarg.h>
void f(int n, ...)
{
va_list v1;
va_start(v1, n);
printf("%s", va_arg(v1, char *));
va_end(v1);
}
int main()
{
//포인터
char *p = "awd";
f(1, p);
}

2. char형 하나만 할당해서 포인터 변수로 넘겨줄 때
#include <stdio.h>
#include <stdarg.h>
void f(int n, ...)
{
va_list v1;
va_start(v1, n);
printf("%c", *(va_arg(v1, char *)));
va_end(v1);
}
int main()
{
//char 형(char로 뽑을 때)
char aa = 'a';
char *p1 = &aa;
f(1, p1);
}

3. 소수점
#include <stdio.h>
#include <stdarg.h>
void f(int n, ...)
{
va_list v1;
va_start(v1, n);
printf("%f", va_arg(v1, double));
va_end(v1);
}
int main()
{
f(1, 10.2);
}

4. char 형
→ char형은 넘기더라도 가변인자에서 int형으로 받음
왜 그럴까?
-> 가변인자에서는 최소 바이트수가 4바이트이기 때문
#include <stdio.h>
#include <stdarg.h>
void f(int n, ...)
{
va_list v1;
va_start(v1, n);
printf("%d", va_arg(v1, int));
va_end(v1);
}
int main()
{
//char 형
char ch = 'c';
f(1, ch);
}

반응형
'42Seoul > printf' 카테고리의 다른 글
printf implement (0) | 2023.05.20 |
---|---|
printf 반환형(반환형이 왜 int일까?) (0) | 2023.05.20 |