์ƒˆ์†Œ์‹

๐Ÿณ 42 SEOUL

[C / 42seoul / ft_printf] - ๊ฐ€๋ณ€์ธ์ž (variable argument)

  • -

๊ฐ€๋ณ€์ธ์ž (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](

Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.