ํ๋ก์ ํธ ๋ชฉํ: ์ค์ printf์ ๋ชจ๋ฐฉ ํจ์์ธ ft_printf๊ฐ ํฌํจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ libftprintf.a ์์ฑ
ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ: Makefile์ ์ฌ์ฉํ๋ ์ต์ํ all, clean, fclean, re ๊ท์น์ ํฌํจํด์ผ ํ๋ค.
์ ํ ์ง์
1. ๊ฐ๋ณ ์ธ์ ํจ์
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์ ํ๋กํ ํ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
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 *);
๋๊ธ