[42 Seoul] ft_printf
νλ‘μ νΈ λͺ©ν: μ€μ printfμ λͺ¨λ°© ν¨μμΈ ft_printfκ° ν¬ν¨λ λΌμ΄λΈλ¬λ¦¬ libftprintf.a μμ±
νλ‘μ νΈ μꡬ μ¬ν: Makefileμ μ¬μ©νλ μ΅μν all, clean, fclean, re κ·μΉμ ν¬ν¨ν΄μΌ νλ€.
μ ν μ§μ
1. κ°λ³ μΈμ ν¨μ
[μ€μΉ΄μ CμΈμ΄ κ°μ’] 31-1 κ°λ³ μΈμ ν¨μλ?
[μ€μΉ΄μ CμΈμ΄ κ°μ’] 31-1 κ°λ³ μΈμ ν¨μλ? λ¨Έλ¦¬λ§ μλ νμΈμ. Programogλ₯Ό ...
blog.naver.com
κ°λ³ μΈμ ν¨μ λ§λ€κΈ°
#include #include // va_list, va_start, va_arg, va_endκ° μ μλ ν€λ νμΌ void printNumbers(int args, ...) // κ°λ³ μΈμμ κ°μλ₯Ό λ°μ, ...λ‘ κ°λ³ μΈμ μ€μ { va_list ap; // κ°λ³ μΈμ λͺ©λ‘ ν¬μΈν° (argum
www.notion.so
printf ν¨μλ λ§€κ° λ³μμ κ°μκ° μ ν΄μ§μ§ μμ ν¨μμ΄λ€. μ΄λ κ² λ§€λ² ν¨μμ λ€μ΄κ°λ μΈμμ κ°μκ° λ³νλ κ²μ κ°λ³ μΈμλΌκ³ νλ€. ν¨μμμ κ°λ³ μΈμλ₯Ό μ μν λλ κ³ μ λ§€κ° λ³μκ° ν κ° μ΄μ μμ΄μΌ νλ©° κ³ μ λ§€κ° λ³μ λ€μ ...μ λΆμ¬ λ§€κ° λ³μμ κ°μκ° μ ν΄μ§μ§ μμλ νμλ₯Ό ν΄μ€λ€. λ¨, ... λ€μλ λ€λ₯Έ λ§€κ° λ³μλ₯Ό μ§μ ν μ μλ€.
λ°νκ°μλ£ν ν¨μ μ΄λ¦(μλ£ν κ³ μ λ§€κ°λ³μ, ...)
{
}
κ³ μ λ§€κ° λ³μκ° μλ ...λ‘ λ°μ κ°λ³ μΈμλ€μ μ²λ¦¬νλ €λ©΄ stdarg.hμ μ μλ κ°λ³ μΈμ μ²λ¦¬ λ§€ν¬λ‘λ₯Ό μ¬μ©ν΄μΌ νλ€.
stdarg.hμ μ μλ κ°λ³ μΈμ μ²λ¦¬ λ§€ν¬λ‘λ λ€μκ³Ό κ°λ€.
va_list
μλ£νμ΄λ€. κ°λ³ μΈμ λͺ©λ‘μ μλ―Ένκ³ κ°λ³ μΈμμ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ μ₯νλ ν¬μΈν°μ΄λ€.
ν¨μλ‘ μ λ¬λλ μΈμλ€μ μ€ν μμμ μ μ₯λλ©° ν¨μλ μ€ν μμμμ μΈμλ₯Ό κΊΌλ΄ μ΄λ€. μ€νμ μλ μΈμλ₯Ό μ½μ λ ν¬μΈν° μ°μ°μ ν΄μΌ νλλ° νμ¬ μ½κ³ μλ λ²μ§λ₯Ό κΈ°μ΅νκΈ° μν΄ va_listνμ ν¬μΈν° λ³μ νλκ° νμνλ€. λ³μ μ΄λ¦μ apλ‘ λμ΄μλλ° apλ μ΄λκΉμ§λ μ§μ λ³μμΌλΏμ΄λ―λ‘ μ΄λ¦μ λ§μλλ‘ μ ν μ μλ κ΄μ΅μ μΌλ‘ κ°λ³ μΈμλ₯Ό λ€λ£¨λ λ§€ν¬λ‘μμλ apλΌλ μ΄λ¦μ μ¬μ©νλ€. va_list νμ μ char * νμΌλ‘ μ μλμ΄ μλ€. κ°λ³ μΈμλ₯Ό μ½κΈ° μν ν¬μΈν° λ³μλ₯Ό μ μΈνλ€κ³ μκ°νλ©΄ λλ€.
va_start
void va_start(va_list ap, last)
ap: va_listλ‘ λ§λ ν¬μΈν°κ° λ΄κΈ΄λ€.
last: κ°λ³ μΈμ λͺ©λ‘μ 첫 λ²μ§Έ μΈμ λ°λ‘ μμ μ€λ νμ λ§€κ° λ³μμ μ΄λ¦, μ¦ λ§μ§λ§ κ³ μ λ νμ μΈμκ° λ΄κΈ΄λ€.
va_listλ‘ μ μΈν ν¬μΈν° apλ₯Ό μ΄κΈ°ννκΈ° μν λ§€ν¬λ‘ ν¨μμ΄λ€. λ λ²μ§Έ μΈμλ‘ λ§μ§λ§ κ³ μ μΈμλ₯Ό μΈμλ‘ μ·¨νλ μ΄μ λ, λ§μ§λ§ κ³ μ μΈμ λ€μμ μ£Όμκ° μ²« λ²μ§Έ κ°λ³ μΈμκ° μ리 μ‘κ³ μμΌλ―λ‘ λ§μ§λ§ κ³ μ μΈμμ μ£Όμ κ°μ μλ©΄ 첫 λ²μ§Έ κ°λ³μΈμμ μ£Όμκ°λ μ μ μλ€. 첫 λ²μ§Έ κ°λ³ μΈμμ μ£Όμκ°μ ν¬μΈν° apμκ² λμ νλ€.
va_arg
type va_arg(va_list ap, type)
ap: va_listλ‘ λ§λ ν¬μΈν°κ° λ΄κΈ΄λ€.
type: intλ long, doubleκ³Ό κ°μ νμ μ΄λ¦μ΄ λ΄κΈ΄λ€.
apλ‘ μ§μ λ μμΉμμ μ§μ λ type κ°μ κ²μνκ³ λ¦¬μ€νΈμμ λ€μ μΈμλ₯Ό κ°λ¦¬ν€λλ‘ apλ₯Ό μ¦κ°μμΌ λ€μ μΈμκ° μμλλ μμΉλ₯Ό κ²°μ νλ€. μ¦, νΉμ κ°λ³ μΈμλ₯Ό κ°λ¦¬ν€κ³ μλ va_listμ ν¬μΈν°λ₯Ό λ€μ κ°λ³ μΈμλ‘ μ΄λμμΌ μ£Όλ λ§€ν¬λ‘ ν¨μμ΄λ€.
typeμ μ€μ ν λ, char, shortμ κ²½μ°μλ intλ‘ λμ μ°κ³ , floatμ κ²½μ°μλ doubleλ‘ λμ μ΄ μ΄ν ν λ³νμ ν΄μ£Όμ΄μΌ νλ€.
ex) char ch = (char) va_arg(ap, int);
va_end
void va_end(va_list ap)
λͺ¨λ μΈμκ° κ²μλ ν va_endλ ν¬μΈν°λ₯Ό NULLλ‘ λ€μ μ€μ νλ€. μ¦, ν¬μΈν° apμ λ΄μ©μ κΉλνκ² μ 리ν΄μ£Όλ λ§€ν¬λ‘ ν¨μμΈ κ²μ΄λ€.
2. printf νμ λ¬Έμμ΄(format)
"νμνκ·Έμ μμμ§μ μ" printf ν¨μμ μ΅μ μμ보기
νμλ¬Έμμ΄? ν¬λ§·? νμνκ·Έ? μμμ§μ μ? ν·κ°λ¦¬λ printf ν¨μμ μ΅μ λ€μ μ 리ν΄λ³΄μλ€.
velog.io
printfμ νλ‘ν νμ μ λ€μκ³Ό κ°λ€.
int printf(const char * format, ...)
printfμ κ³ μ μΈμ formatμ νν μ°λ¦¬κ° μΆλ ₯νκ³ μ νλ λ¬Έμμ΄μ΄κ³ , μ΄ λ¬Έμμ΄ μμλ % λ¬Έμλ‘ μμνλ μμμ§μ μ
κ° μ‘΄μ¬νλ€. μ΄ μμμ§μ μμ λ€μν νλκ·Έ, ν, μ λ°λ, κΈΈμ΄λ€μ μ΅μ
μ μ‘°ν©ν΄μ μ¬μ©ν μ μλ€. μμμ§μ μμ μ΅μ
μ μΆκ°νλ €λ©΄ μ ν΄μ§ νμ νκ·Έ
μ ννλ₯Ό μ§μΌμΌ νλ€. printfμ νμ νκ·Έλ μλμ κ°λ€.
%[flag][width][.precision][κΈΈμ΄]μμμ§μ μ
νμ νκ·Έλ μΆλ ₯ν κ°, μ¦ κ°λ³ μΈμμ λν΄ κ°κ° μ μ©λκΈ° λλ¬Έμ κ°λ³ μΈμμ κ°μκ° νμ νκ·Έμ κ°μμ κ°κ±°λ 컀μΌλ§ νλ€. μ΅μνμ νμ νκ·Έλ % μ μμμ§μ μλ‘ κ΅¬μ±λλ€. []λ‘ λλ¬μΈμΈ λΆλΆμ μ΅μ μ΄λ―λ‘ μλ΅ν μ μλ€.
ft_printf νλ‘μ νΈλ μ΅μ
μ€μ -
, 0
, .μ«μ
, *
, μ«μ
λ₯Ό ꡬνν΄μΌ νλ―λ‘ μ΄ μ΅μ
λ€λ§ μ 리νλ € νλ€.
μ΅μ | μ€λͺ |
- |
νλμμ κ°μ μΌμͺ½μΌλ‘ μ λ ¬νλ€. κΈ°λ³Έμ μΌλ‘ μ€λ₯Έμͺ½μΌλ‘ μ λ ¬νλ€. |
0 |
μ€λ₯Έμͺ½ μ λ ¬μΌ λλ§ κ³΅λ°±μ 0μΌλ‘ μ±μ΄λ€. |
.μ«μ |
μ€μμΌ λ μμμ μ΄νμ μλ¦Ώ μλ₯Ό κ²°μ νλ€. μΌλΆ specifierμμλ§ μ¬μ© κ°λ₯νκ³ κ·Έ μΈμ κ°μμλ 무μνλ€. (μ€μν, λ¬Έμμ΄, μ μνμμ μ¬μ© κ°λ₯) |
μ«μ | μ§μ ν μ«μλ§νΌ ν ν¬κΈ°λ₯Ό μ€μ νλ€. |
* |
νμ΄λ μ λ°λλ₯Ό νμ λ¬Έμμ΄μ μ§μ ν΄μ λ°μ§ μμ§λ§, κ·Έ λμ μ νμ λ¬Έμμ΄ λ€μ μ€λ μΈμλ€μ λ£μ΄μ λ°λλ€. μ΄ λ, μ΄λ μ μ κ°μ΄μ¬μΌ νλ©° νμ΄λ μ λ°λλ₯Ό μ§μ νλ λ³μ λ€μ μΆλ ₯ν λ°μ΄ν°κ° μμΉνλ©΄ λλ€. μμ μ°Έκ³ |
μ΅μ μ¬μ© μμ
#include <stdio.h>
int main()
{
int num = 1;
printf("[%*dHi]\n", -3, num);
printf("[%6.*dHi]\n", 3, num);
printf("[%03d]", num);
}
>>> [1 Hi]
[ 001Hi]
[001]
μ΄λ² νλ‘μ νΈμμ ꡬνν΄μΌ ν μμμ§μ μ
λ λ€μκ³Ό κ°λ€.
type | μΆλ ₯ νν | μμ |
c |
λ¬Έμ | a |
d or i |
λΆνΈ μλ 10μ§λ²μΌλ‘ λνλ μ μ | 392 |
s |
λ¬Έμμ΄ | sample |
p |
ν¬μΈν° μ£Όμ | 0x7ffeeb7c6afc |
u |
λΆνΈμλ 10μ§λ²μΌλ‘ λνλΈ μ μ (unsigned int) | 7235 |
x |
λΆνΈμλ 16 μ§λ²μΌλ‘ λνλΈ μ μ (μλ¬Έμ μ¬μ©) | 7fa |
X |
λΆνΈμλ 16 μ§λ²μΌλ‘ λνλΈ μ μ (λλ¬Έμ μ¬μ©) | 7FA |
printfλ μΆλ ₯μ μ±κ³΅νλ©΄ μΆλ ₯λ μ 체 λ¬Έμμ κ°μλ₯Ό λ°ννλ€. μΆλ ₯μ μ€ν¨νλ©΄ μμκ° λ°νλλ€.
β» μ΄λ² νλ‘μ νΈμμλ μμμ§μ μ λΏλ§ μλλΌ %λ₯Ό μΆλ ₯νκΈ° μν %%
νμλ ꡬνν΄μΌ νλ€. μ΄ νμ λν νμ νκ·Έ κ·μΉμ΄ μ‘΄μ¬νλ€.
Ft_printf ꡬν
1. νμ νκ·Έ κ·μΉ
νμ νκ·Έ κ³΅ν΅ κ·μΉ
1. -
νλκ·Έκ° μλλ° νμ΄ μμμΌ κ²½μ°, μ¦ -
νλκ·Έκ° μ¬λ¬ κ° μλ κ²½μ°
ex) ft_printf("%--3d", 1);
=> -
νλκ·Έκ° νλ μλ κ²μ²λΌ νλνλ€.
2. μ λ°λμ μμκ° λ€μ΄μ¬ κ²½μ°
ex) ft_printf("%10.-3d", 1);
=> μ λ°λκ° λ¬΄μλΉνλ€.
3. 0
νλκ·Έμ -
νλκ·Έλ κ°μ΄ μ°μΌ μ μκ³ , νμ΄λ μ λ°λμ *
μ μ«μ
λ κ°μ΄ μ°μΌ μ μλ€.
μμμ§μ μ cμ νμ νκ·Έ κ·μΉ
1. 0
νλκ·Έμ μ λ°λλ warningμ΄ λ¬λ€. .
μ warningμ μ λ¨μ§λ§ μ λ°λ κ°μ΄ μ£Όμ΄μ§μ§ μμΌλ μ λ°λμ λν λμμ νμ§ μλλ€.
2. -
νλκ·Έμ νλ§ μ μμ μΌλ‘ λμνλ€.
μμμ§μ μ dμ iμ νμ νκ·Έ κ·μΉ
1. 0
νλκ·ΈμΌ λλ μ°μΈ‘ μ λ ¬μΌ λλ§ λ¨μ νμ 0μ μ±μ΄λ€.
2. μ λ°λλ 0
νλκ·Έμ λΉμ·ν λμμ νλ€. μ λ°λκ° μΆλ ₯ν κ°μ μλ¦Ώμλ³΄λ€ ν¬λ€λ©΄ λ¨μ μλ¦Ώμλ₯Ό 0μΌλ‘ μ±μ΄λ€. 0
νλκ·Έμ κ°μ΄ μ°μ΄λ©΄ 0
νλκ·Έκ° λ¬΄μλΉνλ€.
3. λ§μ½ μ λ°λκ° μμλΌλ©΄ μ λ°λκ° λ¬΄μλΉνκΈ° λλ¬Έμ 0
νλκ·Έμ κ°μ΄ μ°μΈλ€λ©΄ 0
νλκ·Έλ μ μ λμνλ€.
4. μΆλ ₯ν κ°μ΄ 0μ΄κ³ μ λ°λλ 0μ΄λΌλ©΄ μ무κ²λ μΆλ ₯λμ§ μμμΌ νλ€. μ΄λ, νμ΄ μ‘΄μ¬νλ©΄ 곡백 λ¬Έμκ° νλ§νΌ μΆλ ₯λλ€.
5. μμμΌ κ²½μ° λΆνΈ - λ νμ ν¬ν¨λκ³ μ λ°λμμμ 0 μΆλ ₯μ λΆνΈ - λ€μμ λμνλ€.
μμμ§μ μ sμ νμ νκ·Έ κ·μΉ
1. 0
νλκ·Έ warning
2. μ λ°λκ° 0μ΄κ±°λ .
λ§ μ¨λ€λ©΄ μ무κ²λ μΆλ ₯νμ§ μλλ€. μ΄λ, νμ΄ μ‘΄μ¬νλ©΄ 곡백 λ¬Έμκ° νλ§νΌ μΆλ ₯λλ€.
3. μ λ°λκ° μΆλ ₯ν λ¬Έμμ΄μ κΈΈμ΄λ³΄λ€ κΈΈ λλ λ¬Έμμ΄μ κΈΈμ΄λ§νΌ μΆλ ₯λκ³ , μ λ°λκ° μ§§λ€λ©΄ μ λ°λλ§νΌ μΆλ ₯λλ€.
μμμ§μ μ u,x, Xμ νμ νκ·Έ κ·μΉ
1. νμ νκ·Έ κ·μΉμ dμΌ λμ λΉμ·νλ€. νμ§λ§ u, x, Xλ λͺ¨λ λΆνΈκ° μλ unsigned int νμ μ κ°μ μΆλ ₯νλ―λ‘ μμμ κ΄λ ¨λ κ·μΉμ μκ°ν΄ μ€ νμκ° μλ€.
μμμ§μ μ pμ νμ νκ·Έ κ·μΉ
1. 0
νλκ·Έ warning
2. μ λ°λμ 0μ ν¬ν¨ν μ«μ
λ *
κ° μ£Όμ΄μ§λ€λ©΄ warningμ΄λ€. .
λ§ μ€λ 건 μ μ λμνλ€.
% μ νμ νκ·Έ κ·μΉ
1. 0
νλκ·Έμ -
νλκ·Έ λͺ¨λ μ μ λμνλ€. μ΄λ, 0
νλκ·Έμ -
νλκ·Έκ° μ μΌνκ² κ°μ΄ μ°μΌ μ μλλ° 0
νλκ·Έκ° λ¬΄μλΉνλ€.
2. μ λ°λκ° μ‘΄μ¬νμ¬λ μ λ°λκ° μλ κ²μ²λΌ νλνλ€.
2. κ°λ³ μΈμ νμ
κ° μμμ§μ μλ§λ€ κ°λ³ μΈμλ₯Ό λ°μμμ μ¬μ©νλ €λ©΄ μμμ§μ μμ μλ§μ λ°μ΄ν° νμ μ va_arg λ§€ν¬λ‘ ν¨μμ λ λ²μ§Έ λ§€κ° λ³μμ μ§μ ν΄μ€μΌ νλ€.
1. μμμ§μ μ c, d, i
va_arg(ap, int);
2. μμμ§μ μ s
va_arg(ap, char *);
3. μμμ§μ μ u, x, X
va_arg(ap, unsigned int);
4. μμμ§μ μ p
va_arg(ap, void *);