Search
🐾

ft_printf

Created
2022/01/13 13:34
Updated
2022/01/13 13:38
Tags
Circle 01
printf
Author
Created
Updated
mcha(Min-jae Cha)
2022. 01. 13
2022. 01. 13

Subtitle

Because putnbr and putstr aren’t enough

Version

9

Specification

Function name
ft_printf
Prototype
int ft_printf(const char *, ...);
Turn in files
.c, /.c, *.h, /.h, Makefile
Makefile
all, clean, fclean, re, bonus
External functs.
malloc, free, write, va_start, va_arg, va_copy, va_end
Description
Write a library that contains ft_printf, a function that will mimic the real printf

1. Summary

β†’ libc의 printf ν•¨μˆ˜λ₯Ό μž¬κ΅¬ν˜„ printf ν•¨μˆ˜λŠ” <stdio.h> λΌμ΄λΈŒλŸ¬λ¦¬μ— ν¬ν•¨λ˜μ–΄ μžˆλ‹€.
printf의 fλŠ” formatted의 μ•½μžμ΄λ‹€. 이것은 formatted된 좜λ ₯을 ν‘œμ‹œ ν•˜λŠ” 데 쓰인닀.
printf에 λ“€μ–΄κ°€λŠ” format placeholder듀은 맀우 λ§Žλ‹€.
%[parameter][flags][width][.precision][length]type
이 쀑 μš°λ¦¬κ°€ κ΅¬ν˜„ν•΄μ•Ό ν•  것(Version : 9) : flags, width, type, precision

κ°€λ³€ 인자 (variadic arguments)

κ°œμˆ˜μ™€ νƒ€μž…μ΄ μ •ν•΄μ Έ μžˆμ§€ μ•Šκ³  κ°€λ³€ ν•  수 μžˆλŠ” 인자
ν•¨μˆ˜μ˜ μ΄λ¦„μ΄λ‚˜ μ›ν˜•, κ³ μ • 인수의 개수 등은 ν•„μš”μ— 따라 자유둭게 μž‘μ„±ν•  수 μžˆλ‹€.
λ§ˆμ§€λ§‰ 인수 μžλ¦¬μ— "..."만 있으면 κ°€λ³€ 인수 ν•¨μˆ˜κ°€ λ§Œλ“€μ–΄μ§„λ‹€.
int a(int x, int y); int b(int x, int y, ...); printf("str", ..); => str 1 2
C
볡사

ꡬ쑰

β†’ va_list ap

Prototype : char *va_list
ν•¨μˆ˜λ‘œ 전달 λ˜λŠ” μΈμˆ˜λ“€μ€ μŠ€νƒ(Stack)에 μ €μž₯λ˜μ–΄ ν•¨μˆ˜λŠ” μŠ€νƒμ—μ„œ 인수λ₯Ό κΊΌλ‚΄μ–΄ μ‚¬μš©ν•œλ‹€.
μŠ€νƒμ— 인수λ₯Ό 읽을 λ•Œ 포인터 연산을 ν•΄μ•Ό ν•˜λŠ”λ° ν˜„μž¬ 읽고 μžˆλŠ” λ²ˆμ§€λ₯Ό κΈ°μ–΅ν•˜κΈ° μœ„ν•΄ va_list ν˜•μ˜ 포인터 λ³€μˆ˜ ν•˜λ‚˜κ°€ ν•„μš”ν•˜λ‹€.

β†’ va_start(ap, λ§ˆμ§€λ§‰ κ³ μ • 인수)

ap 포인터 λ³€μˆ˜κ°€ 첫 번째 κ°€λ³€ 인수λ₯Ό 가리킀도둝 μ΄ˆκΈ°ν™”
첫 번째 κ°€λ³€ 인수의 λ²ˆμ§€λ₯Ό μ‘°μ‚¬ν•˜κΈ° μœ„ν•΄ λ§ˆμ§€λ§‰ κ³ μ • 인수λ₯Ό μ „λ‹¬ν•œλ‹€.
va_start λ‚΄λΆ€μ—μ„œλŠ” apκ°€ λ§ˆμ§€λ§‰ κ³ μ • 인수 λ‹€μŒ λ²ˆμ§€λ₯Ό 가리킀도둝 ν•΄μ£Όμ–΄, 이후뢀터 apλ²ˆμ§€λ₯Ό 읽으면 μˆœμ„œλŒ€λ‘œ κ°€λ³€ 인수λ₯Ό 읽을 수 μžˆλ‹€.

β†’ va_arg(ap, 인수 νƒ€μž…)

κ°€λ³€ λ³€μˆ˜λ₯Ό μ‹€μ œλ‘œ μ½λŠ” λͺ…λ Ή
va_startκ°€ apλ₯Ό 첫 번째 κ°€λ³€ 인수 λ²ˆμ§€λ‘œ λ§žμΆ”μ–΄ μ£ΌκΈ° λ•Œλ¬Έμ— ap μœ„μΉ˜μ— μžˆλŠ” 값을 읽기만 ν•˜λ©΄ λœλ‹€.
단, ap λ²ˆμ§€μ— μžˆλŠ” 값이 μ–΄λ–€ νƒ€μž…μΈμ§€λ₯Ό 지정해야 이 λ§€ν¬λ‘œκ°€ 값을 μ œλŒ€λ‘œ 읽을 수 μžˆλ‹€.
λ”°λΌμ„œ va_arg의 두 번째 νŒŒλΌλ―Έν„°μ— 읽고자 ν•˜λŠ” κ°’μ˜ νƒ€μž…(type)을 μ§€μ •ν•œλ‹€.
va_arg(ap, int) != va_arg(ap, char)
C
볡사
예λ₯Ό λ“€μ–΄ ap μœ„μΉ˜μ— μžˆλŠ” μ •μˆ˜ 값을 읽고자 ν•œλ‹€λ©΄ va_arg(ap, int)λ₯Ό ν˜ΈμΆœν•˜κ³ , μ‹€μˆ˜ 값을 읽고자 ν•˜λ©΄ va_arg(ap, double)을 ν˜ΈμΆœν•˜λ©΄ λœλ‹€.
va_arg의 두 번째 μΈμžλŠ” λ³€μˆ˜ λͺ…이 μ•„λ‹Œ type인데 μ–΄λ–»κ²Œ ν•¨μˆ˜μ˜ μΈμˆ˜κ°€ 될 수 μžˆλ‚˜? β†’ va_argλŠ” 일반 ν•¨μˆ˜κ°€ μ•„λ‹Œ 맀크둜 ν•¨μˆ˜μ΄κΈ° λ•Œλ¬Έμ΄λ‹€. va_arg의 두 번째 μΈμˆ˜λŠ” λ‚΄λΆ€μ μœΌλ‘œ sizeof μ—°μ‚°μžμ™€ 캐슀트 μ—°μ‚°μžλ‘œ μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— νƒ€μž… λͺ…이 νŒŒλΌλ―Έν„°λ‘œ λ“€μ–΄μ˜¬ 수 μžˆλ‹€.

β†’ va_end(ap)

Β κ°€λ³€ 인수λ₯Ό λ‹€ 읽은 ν›„ λ’· 정리λ₯Ό ν•˜λŠ”λ° μ‚¬μš©λœλ‹€. 사싀 μ‹€μ œλ‘œ 없어도 μ „ν˜€ 지μž₯이 μ—†λ‹€.
va_endκ°€ ν•„μš”ν•œ μ΄μœ λŠ” ν˜Έν™˜μ„± λ•Œλ¬ΈμΈλ°, ν”Œλž«νΌμ— λ”°λΌμ„œλŠ” κ°€λ³€ 인수λ₯Ό 읽은 후에 λ’· 처리λ₯Ό ν•΄μ•Ό ν•˜λŠ” κ²½μš°λ„ 있기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ μ€‘μš”ν•œ 역할을 ν•  μˆ˜λ„ 있기 λ•Œλ¬Έμ— κ΄€λ‘€μ μœΌλ‘œ λ„£μ–΄ μ£ΌλŠ” 것이 μ’‹λ‹€.

κ°€λ³€ μΈμˆ˜λ“€μ„ ν•©ν•΄μ„œ λ°˜ν™˜ν•˜λŠ” μ˜ˆμ‹œ

#include <stdio.h> #include <stdarg.h> int test(int c, ...) { int arg; int sum; int i; va_list ap; sum = 0; i = 0; va_start(ap, c); while (i < 5) { arg = va_arg(ap, int); sum += arg; i++; } va_end(ap); return (sum); } int main(void) { printf("result1 => %d\n", test(1, 1,1,1,1,1)); printf("result2 => %d\n", test(2, 2,2,2,2,2)); printf("result3 => %d\n", test(3, 3,3,3,3,3)); printf("result4 => %d\n", test(4, 4,4,4,4,4)); printf("result5 => %d\n", test(5, 5,5,5,5,5)); return (0); }
C
볡사

κ°€λ³€ 인수 ν•¨μˆ˜μ˜ 쑰건

β†’ κ°€λ³€ 인수 ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ κ³ μ • 인수λ₯Ό κ°€μ Έμ•Ό ν•œλ‹€.
포인터 ap(va_list ap)λ₯Ό μ΄ˆκΈ°ν™” ν•˜κΈ° μœ„ν•΄ va_startλ₯Ό μ‚¬μš©ν•˜μ—¬ λ§ˆμ§€λ§‰ κ³ μ • 인수λ₯Ό λ³΄λ‚΄μ£ΌλŠ”λ°, κ³ μ • μΈμˆ˜κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šλ‹€λ©΄ κ°€λ³€ 인수의 μ‹œμž‘ λ²ˆμ§€κ°€ 어디인지 λͺ¨λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.
κ³ μ • μΈμˆ˜κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ κ°€μž₯ μ²˜μŒμ— λ“€μ–΄μ˜¨ μΈμˆ˜κ°€ κ°€λ³€ 인수의 μ‹œμž‘μ΄μ§€ μ•Šμ€κ°€? 1. int test(int a, ...); 2. int test(...);
β†’ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μžμ‹ μ—κ²Œ 전달 된 κ°€λ³€ 인수의 개수λ₯Ό νŒŒμ•…ν•  수 μžˆλ„λ‘ ν•΄μ•Όν•œλ‹€.
νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„ μ˜€λŠ” 인수의 κ°œμˆ˜μ—λŠ” μ œν•œμ΄ μ—†κ³  μ»΄νŒŒμΌλŸ¬λŠ” ν•¨μˆ˜κ°€ 호좜 될 λ•Œ 인수의 개수λ₯Ό κ²€μ‚¬ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ κ°€λ³€ μΈμˆ˜κ°€ λͺ‡ κ°œλ‚˜ 전달 λ˜μ—ˆλŠ”μ§€ μ•Œλ €μ£Όμ§€ μ•ŠμœΌλ©΄ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 인수의 개수λ₯Ό μ•Œ 수 μžˆλŠ” 방법이 μ—†λ‹€. κ·ΈλŸ¬λ―€λ‘œ 호좜 μΈ‘μ—μ„œ ν•¨μˆ˜μ— κ°€λ³€ 인수의 κ°œμˆ˜μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•΄μ•Όν•œλ‹€.
β†’ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ κ°€λ³€ 인수 각각의 νƒ€μž…μ„ μ•Œ 수 μžˆμ–΄μ•Ό ν•œλ‹€.
va_arg λ§€ν¬λ‘œκ°€ apλ²ˆμ§€μ—μ„œ κ°€λ³€ 인수λ₯Ό 읽을 λ•Œ μ–Όλ§ˆλ§ŒνΌ μ½μ–΄μ„œ μ–΄λ–€ νƒ€μž…μœΌλ‘œ 해석해야 할지λ₯Ό μ•Œμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έ
printfλ₯Ό 예λ₯Ό λ“€μ–΄ %dκ°€ 제일 처음 λ‚˜μ™”μœΌλ©΄ 첫 λ²ˆμ§ΈλŠ” μ •μˆ˜, %fκ°€ λ‚˜μ˜€λ©΄ μ‹€μˆ˜λΌλŠ” 것을 μ•Œκ²Œ λœλ‹€.
κ°€λ³€ 인수의 νƒ€μž…μ„ μ „λ‹¬ν•˜λŠ” 방식도 μ—¬λŸ¬ 가지λ₯Ό 생각할 수 μžˆλŠ”λ°, printf와 같이 ν•˜λ‚˜μ˜ κ³ μ • 인수λ₯Ό 톡해 λͺ¨λ“  κ°€λ³€ 인수의 νƒ€μž…μ„ νŒλ‹¨ν•  수 μžˆλŠ” 힌트λ₯Ό μ œκ³΅ν•˜λŠ” 방식이 κ°€μž₯ μ’‹λ‹€.
#include <stdio.h> #include <stdarg.h> int test(const char *s, ...) { int sum; int arg; va_list ap; sum = 0; va_start(ap, s); for(;;) { arg = va_arg(ap, int); if (arg == 0) break ; sum += arg; } va_end(ap); return (sum); } int main(void) { printf("result1 (1 + 2) => %d\n", test("1+2 => %d\n", 1, 2, 0)); printf("result2 (3 + 4 + 5 + 6) => %d\n", test("3+4+5+6 => %d", 3, 4, 5, 6, 0)); printf("result3 (10 + 11 + 12 + 13) => %d\n", test("10 ~ 13 => %d", 10, 11, 12, 13, 0)); return (0); }
C
볡사

2. Placeholders

1) flags (optional)

Character
Description
Default
- (minus)
μ§€μ •λœ ν•„λ“œ width λ‚΄μ—μ„œ μ™Όμͺ½ μ •λ ¬
우츑 μ •λ ¬
+ (plus)
μ–‘μˆ˜λ©΄ '+' λΆ€ν˜Έλ₯Ό, 음수면 '-' λΆ€ν˜Έλ₯Ό ν‘œμ‹œν•œλ‹€.
음수만 λΆ€ν˜Έ ν‘œμ‹œ
' ' (space)
μ–‘μˆ˜μΈ κ²½μš°μ—λŠ” μ•žμ— 곡백 μ‚½μž…, 음수인 κ²½μš°μ—λŠ” '-' λΆ€ν˜Έ ν‘œμ‹œ λ§Œμ•½ '+' flagκ°€ μ‘΄μž¬ν•œλ‹€λ©΄ 곡백 flagλŠ” λ¬΄μ‹œλœλ‹€.
μ–‘μˆ˜ λΆ€ν˜Έ μ—†μŒ
0 (zero)
'width' μ˜΅μ…˜μ΄ μ§€μ •λœ 경우 숫자 ν˜•μ‹ μ•žμ— 0이 λΆ™λŠ”λ‹€. λ§Œμ•½ '-' flagκ°€ μ‘΄μž¬ν•œλ‹€λ©΄ '0' flag λŠ” λ¬΄μ‹œλœλ‹€.
# (hash)
type의 o,x,X와 μ‚¬μš© 될 경우 0이 μ•„λ‹Œ 값에 λŒ€ν•΄ 0, 0x ,0Xκ°€ 같이 ν‘œμ‹œλœλ‹€. type의 e, E, f, F, g, G 와 ν•¨κ»˜ μ‚¬μš©ν•  경우, 숫자 뒀에 μ˜€λŠ” 것이 없어도 μ†Œμˆ˜μ μ„ ν¬ν•¨ν•˜λ„λ‘ κ°•μ œ.

2) width (optional)

Character
Description
(number)
좜λ ₯ 될 μ΅œμ†Œ 문자 수. 좜λ ₯ν•  값이 이 값보닀 짧으면 κ²°κ³ΌλŠ” 곡백으둜 μ±„μ›Œμ§„λ‹€. λ°˜λŒ€λ‘œ κ²°κ³Όκ°€ 더 크더라도 값이 μž˜λ¦¬μ§€ μ•ŠλŠ”λ‹€.
*
λ„ˆλΉ„ 값을 인자둜 λ°›μ•„μ„œ μ‚¬μš©ν•œλ‹€. 인자둜 받은 값보닀 더 κΈ΄ 값이 λ“€μ–΄μ˜€λ©΄ μ›λž˜ 길이만큼 좜λ ₯ν•œλ‹€.
printf("%5d", 42); // '*'을 μ‚¬μš©ν•˜μ—¬ λ„ˆλΉ„ 값을 인자둜 받은 λͺ¨μŠ΅ printf("%*d", 5, 42);
C
볡사
β†’ width β‰₯ λ¬Έμžμ—΄μ˜ 길이
width κ°’ 만큼 곡간을 λ§Œλ“  λ’€ 우츑 μ •λ ¬ ν•˜μ—¬ λ¬Έμžμ—΄μ„ ν‘œμ‹œν•œλ‹€
#include <stdio.h> int main(void) { printf("%*d", 6, 1234); return (0); }
C
볡사
β†’ width < λ¬Έμžμ—΄μ˜ 길이
width의 값을 λ¬΄μ‹œν•˜κ³  λ¬Έμžμ—΄μ˜ 길이만큼 좜λ ₯ν•œλ‹€
#include <stdio.h> int main(void) { printf("%*d", 6, 1234567); return (0); }
C
볡사

3) .precision (optional)

좜λ ₯ν•˜λŠ” κ°’μ˜ 정확도 ν‘œκΈ°λ₯Ό μœ„ν•œ ν•„λ“œλ‘œ, width ν•„λ“œ λ‹€μŒμœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” ν•„λ“œμ΄κΈ° λ•Œλ¬Έμ— ν•„λ“œ κ°„ ꡬ뢄을 μœ„ν•΄ .은 ν•„μˆ˜μ μœΌλ‘œ μ‚¬μš©λœλ‹€. λ‹¨λ…μœΌλ‘œ .이 이용 λ˜κΈ°λ„ ν•˜λ©° .κ³Ό 숫자(number)λ₯Ό μ‘°ν•©ν•˜μ—¬ μ‚¬μš©ν•˜κΈ°λ„ ν•œλ‹€.
각각의 κ²½μš°μ—λŠ” type ν•„λ“œμ˜ μ˜΅μ…˜(μ’…λ₯˜)에 따라 좜λ ₯ 값이 바뀐닀.
 이 μ˜΅μ…˜μ€ width, length, type에 따라 영ν–₯을 λ°›κΈ° λ•Œλ¬Έμ— μœ μ˜ν•΄μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€.

β†’ Usability

Declaration
Character
Description
.
[type]
λ‹¨λ…μœΌλ‘œ .만 μ‚¬μš©λœ 경우
c, p
정확도λ₯Ό λ¬΄μ‹œν•˜κ³  type μ˜΅μ…˜μ— λ”°λ₯Έ 값을 좜λ ₯
d, i, o, u, x, X
flags ν•„λ“œμ— 0이 주어지면, μ˜΅μ…˜ 0을 λ¬΄μ‹œν•˜κ³  처리
f, e, E, g, G, a, A
μ†Œμˆ˜μ  μ•„λž˜ 좜λ ₯ν•˜μ§€ μ•ŠμŒ. λ§ˆμ§€λ§‰ μˆ«μžλŠ” λ°˜μ˜¬λ¦Όν•˜μ—¬ 처리
s
λ¬Έμžμ—΄μ„ 좜λ ₯ν•˜μ§€ μ•ŠμŒ
*s
좜λ ₯ν•  μ΅œλŒ€ 길이λ₯Ό 인자둜 λ„˜κ²¨ λ°›μ•„, ν•΄λ‹Ή 길이 만큼만 λ¬Έμžμ—΄ 좜λ ₯
.n
[type]
nn은 숫자λ₯Ό μ˜λ―Έν•˜λ©°, μ–‘μˆ˜λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. 음수λ₯Ό μ‚¬μš©ν•˜λ©΄ width의 μ˜΅μ…˜ 값을 λ¬΄μ‹œν•˜κ³ , .precision의 κ°’μœΌλ‘œ λ“€μ–΄μ˜¨ 음수 nnλ§ŒνΌμ„ width의 μ˜΅μ…˜ κ°’μœΌλ‘œ μΈμ‹ν•œλ‹€. widthμ—μ„œμ˜ 음수 처리 방식을 λ”°λ₯΄λ―€λ‘œ 쒌츑 정렬을 μˆ˜ν–‰ν•œλ‹€.
c
정확도λ₯Ό λ¬΄μ‹œν•˜κ³  type μ˜΅μ…˜μ— λ”°λ₯Έ 값을 좜λ ₯
d, i, o, u, x, X
좜λ ₯ν•  μ΅œλŒ€ 자릿수λ₯Ό 지정. μžλ¦Ώμˆ˜μ—μ„œ 좜λ ₯ν•  κ°’μ˜ 길이λ₯Ό λΊ€ 남은 곡간은 기본적으둜 0으둜 좜λ ₯. 좜λ ₯ ν•˜κ³ μž ν•˜λŠ” μ •μˆ˜ 값이 0이고, nn λ˜ν•œ 0이라면 좜λ ₯ 값이 μ—†μŒ.
f, e, E, g, G, a, A
좜λ ₯ν•  μ†Œμˆ˜μ  자릿수 지정. 좜λ ₯ν•  자리 μ§ν›„μ˜ 숫자λ₯Ό λ°˜μ˜¬λ¦Όν•˜μ—¬ 자릿수 내에 좜λ ₯ν•  수 μžˆλ„λ‘ ν•œλ‹€. μ‹€μˆ˜ κ°’μœΌλ‘œ 0.0이 λ“€μ–΄μ™”λŠ”λ° n이 0이라면 0을 좜λ ₯ν•œλ‹€.
s
λ¬Έμžμ—΄μ—μ„œ 좜λ ₯ν•  μ΅œλŒ€ 길이λ₯Ό 지정. μ„€μ •ν•œ 길이가 λ¬Έμžμ—΄λ³΄λ‹€ 크닀면 μ›λž˜ 길이의 λ¬Έμžμ—΄μ„ 좜λ ₯ if (n > strlen(s)) β‡’ print(s)
p
0xλ₯Ό μ œμ™Έν•˜κ³  총 길이λ₯Ό 주어진 nn에 λ§žμΆ”μ–΄ 좜λ ₯ν•œλ‹€.

[1] λ‹¨λ…μœΌλ‘œ .만 μ‚¬μš©λœ 경우

c, p
d, i, o, u, x, X
s

[2] .에 숫자λ₯Ό λͺ…μ‹œν•˜μ—¬ type을 λ”°λ₯Έ μ˜ˆμ‹œ

c, p
d, i, o, u, x, X
s

각 μ„œμ‹ μ§€μ •μž 별 ν”Œλž˜κ·Έμ˜ μž‘μš©

type \ flag
'-'
'+'
'(space)'
'#'
'0'
precision(정밀도)
d
width ν•„λ“œ λ‚΄μ—μ„œ 쒌츑 μ •λ ¬ [ '0' ] β†’ ignored Error
μ–‘μˆ˜(0 포함)인 경우 μ•žμ— '+' λΆ€ν˜Έ μ‚½μž… [ ' ' ] β†’ ignored Error
μ–‘μˆ˜(0 포함)인 경우 μ•žμ— ' '뢙인닀. [ '+' ] β†’ ignored Error
Undefined
ν•„λ“œμ—μ„œ 빈 칸을 '0' 문자둜 μ±„μš΄λ‹€. [ '-', 정밀도 ] β†’ ignored Error
좜λ ₯될 자릿수λ₯Ό 지정
i
μœ„μ™€ κ°™μŒ
μœ„μ™€ κ°™μŒ
μœ„μ™€ κ°™μŒ
Undefined
μœ„μ™€ κ°™μŒ
μœ„μ™€ κ°™μŒ
u
μœ„μ™€ κ°™μŒ
Undefined
Undefined
Undefined
μœ„μ™€ κ°™μŒ
μœ„μ™€ κ°™μŒ
x
μœ„μ™€ κ°™μŒ
Undefined
Undefined
숫자 μ•žμ— '0x' λΆ™μ—¬μ€€λ‹€. [ 정밀도 ] β†’ 자릿수 카운트 μ•ˆν•¨
μœ„μ™€ κ°™μŒ #κ³Ό 같이 μ“°μ΄λŠ” κ²½μš°λŠ” 0x와 숫자 사이에 '0'이 λ“€μ–΄κ°„λ‹€.
μœ„μ™€ κ°™μŒ
X
μœ„μ™€ κ°™μŒ
Undefined
Undefined
숫자 μ•žμ— '0X' λΆ™μ—¬ μ€€λ‹€. [ 정밀도 ] β†’ 자릿수 카운트 μ•ˆν•¨
μœ„μ™€ κ°™μŒ μœ„μ™€ κ°™μŒ #κ³Ό 같이 μ“°μ΄λŠ” κ²½μš°λŠ” 0X와 숫자 사이에 '0'이 λ“€μ–΄κ°„λ‹€.
μœ„μ™€ κ°™μŒ
s
μœ„μ™€ κ°™μŒ
Undefined
Undefined
Undefined
Undefined
μ΅œλŒ€ 좜λ ₯ 문자 개수
c
μœ„μ™€ κ°™μŒ
Undefined
Undefined
Undefined
Undefined
Undefined
p
μœ„μ™€ κ°™μŒ
Undefined
Undefined
Undefined
Undefined
Undefined
%(percentage)
μœ„μ™€ κ°™μŒ

Consider

1) ' % '

%와 % 사이에 μ–΄λŠ ν”Œλž˜κ·Έκ°€ μžˆμ–΄λ„ λ‹€ λ¬΄μ‹œν•œλ‹€.
μ˜ˆμ‹œ (μŠ€μ••)

2) .precision vs width

μŒμˆ˜κ°€ 듀어갔을 경우의 좜λ ₯κ°’
μ˜ˆμ‹œ

Ignored Combination

1) ' -0 ' or ' 0- '

#include <stdio.h> int main(void) { printf("================= Test 'd' =================\n"); printf("%-0d\n", 10); printf("%+d\n", 10); return (0); }
C
볡사

2) ' (space)+ ' or ' +(space) '

#include <stdio.h> int main(void) { printf("================= Test 'd' =================\n"); printf("% +d\n", 10); printf("% d\n", 10); return (0); }
C
볡사

Undefined Combination

1) ' +u ', ' +x ', ' +X ', ' +c ' , ' +p ', ' +s '

#include <stdio.h> int main(void) { printf("================= Test 'u' =================\n"); printf("%+u\n", 10); printf("%u\n", 10); return (0); }
C
볡사

2) ' (space)u ', ' (space)x ', ' (space)X ', ' (space)c ' , ' (space)p ', ' (space)s '

#include <stdio.h> int main(void) { printf("================= Test 'space' =================\n"); printf("% u\n", 10); printf("%u\n", 10); return (0); }
C
볡사

3) ' 0(number)c ', ' 0(number)p ', ' 0(number)s '

#include <stdio.h> int main(void) { printf("================= Test '0' =================\n"); printf("%05s\n", "A"); // c, p, s printf("%s\n", "A"); // c, p, s return (0); }
C
볡사

4) ' .(number)p ', ' .(number)c '

#include <stdio.h> int main(void) { printf("================= Test 'precision' =================\n"); printf("%.5p", "ABCDEFG"); return (0); }
C
볡사