π³ 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
μ°Έκ³ μλ£