🐳 42 SEOUL

[C / 42seoul / ft_printf] - κ°€λ³€μΈμž (variable argument)

Newmon 2021. 5. 27. 16:01

κ°€λ³€μΈμž (variable argument)

 

 

κ°€λ³€ μΈμžλž€?

Cμ–Έμ–΄μ—μ„œλŠ” scanf ν˜Ήμ€ printf 처럼 λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λ‚˜ νƒ€μž…μ΄ μ •ν•΄μ§€μ§€ μ•Šμ€ ν•¨μˆ˜λ“€μ΄ μžˆλ‹€. 이런 ν•¨μˆ˜λ“€μ€ μ‚¬μš©ν• λ•Œλ§ˆλ‹€ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κ°€ 달라지며, μ΄λŸ¬ν•œ 것을 κ°€λ³€μΈμžλΌκ³  ν•œλ‹€.

*λ”°λΌμ„œ ft_printf ν”„λ‘œμ νŠΈμ—μ„œ κ°€μž₯ μ€‘μš”ν•œ 뢀뢄이라고 ν•  수 μžˆλ‹€. *

 

 

 

κ°€λ³€ 인자 ν•¨μˆ˜ 생성

  • ν•¨μˆ˜μ—μ„œ κ°€λ³€ 인자λ₯Ό μ •μ˜ν• λ•ŒλŠ” κ³ μ • λ§€κ°œλ³€μˆ˜κ°€ ν•œκ°œ 이상 μžˆμ–΄μ•Όν•œλ‹€.
  • κ³ μ • λ§€κ°œλ³€μˆ˜ 뒀에 ...을 λΆ™μ—¬ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κ°€ μ •ν•΄μ Έμžˆμ§€ μ•Šλ‹€κ³  ν‘œμ‹œλ₯Ό ν•΄μ€€λ‹€.
  • (단 ...λ’€μ—λŠ” λ‹€λ₯Έ λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ •ν•  수 μ—†μœΌλ―€λ‘œ ...은 κ°€μž₯ λ§ˆμ§€λ§‰μ— λͺ…μ‹œν•΄μ•Όν•œλ‹€.)

 

 

κ°€λ³€ 인자 ν•¨μˆ˜ μ˜ˆμ‹œ

void va_function(int args, ...)
{
    printf("args");  
}

int main()
{
  va_function(1,2,7);
  va_function(1,2,3,4,5,6,7);
  return 0;
}
//인자 개수λ₯Ό 바꿔넣어도 컴파일 μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

 

 

 

κ°€λ³€ 인자 μ‚¬μš©

 

 λ°›μ•„μ˜¨ κ°€λ³€μΈμžλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” <stdarg.h> ν—€λ”νŒŒμΌμ— μ •μ˜λ˜μ–΄μžˆλŠ” λ§€ν¬λ‘œλ“€μ„ μ‚¬μš©ν•΄μ•Όν•œλ‹€.

  • <stdarg.h> ν—€λ”νŒŒμΌμ— μ •μ˜λ˜μ–΄ μžˆλŠ” 맀크둜λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€λ³€ 인자λ₯Ό μ‚¬μš©ν•œλ‹€.
  • va_list : κ°€λ³€ 인자 λͺ©λ‘μ„ μ„ μ–Έν•˜λŠ” typedef (κ°€λ³€μΈμžλ“€μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” 포인터)
  • va_start(ap, param) : κ°€λ³€ 인자λ₯Ό κ°€μ Έμ˜¬μˆ˜ μžˆλ„λ‘ μ€€λΉ„ν•œλ‹€. 
  • va_arg(ap, type) : κ°€λ³€ 인자 ν¬μΈν„°λ‘œλΆ€ν„° type크기만큼 μ—­μ°Έμ‘° ν•˜μ—¬ 값을 κ°€μ Έμ˜¨λ‹€. (κ°€μ Έμ˜¨ 인수λ₯Ό λ¦¬ν„΄ν•œλ‹€.)
  • va_end(ap): κ°€λ³€ 인자 포인터 null둜 μ΄ˆκΈ°ν™”
  • 보톡 첫 번째 λ§€κ°œλ³€μˆ˜μ—λŠ” κ°€λ³€ 인자의 개수λ₯Ό 받도둝 μ§€μ •ν•œλ‹€.

 

 

κ°€λ³€ 인자λ₯Ό μ‚¬μš©ν•œ ν•¨μˆ˜μ‚¬μš© μ˜ˆμ‹œ

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

int multipleNumbers(int args, ...)
{
  va_list ap;
  int i = 0;
  int ret = 1;

  va_start(ap, args);
  while (i++ < args)
  {
    ret *= va_arg(ap, int);
  }
    return ret;
}

int main()
{
  int ret;

  ret = multipleNumbers(3, 3, 5, 9); // λ§€κ°œλ³€μˆ˜ 개수 3개, λ§€κ°œλ³€μˆ˜λŠ” 3, 5, 9
  printf("result : %d", ret);
  return 0;
}

>>> 135

 

 

 

 

 

 

 

 

 

참고자료

[https://dojang.io/mod/page/view.php?id=577](