🐳 42 SEOUL

[C / 42seoul / ft_printf] - μ„œμ‹ μ§€μ •μž (format specifier)

Newmon 2021. 6. 1. 15:04

 

 

%[ν”Œλž˜κ·Έ][폭][.정밀도][길이]μ„œμ‹μ§€μ •μž

 

printfλŠ” ν”Œλž˜κ·Έ, 폭, 정밀도, 길이 그리고 μ„œμ‹μ§€μ •μžλ₯Ό μ‘°ν•©ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλŠ” ν•¨μˆ˜μ΄λ‹€.

ft_printf 과제λ₯Ό ν•˜κΈ° μœ„ν•΄ ν•˜λ‚˜ν•˜λ‚˜ λœ―μ–΄λ΄μ•Όκ² λ‹€.

 

μ„œμ‹μ§€μ •μž : csdiupxX%

<stdio.h>의 printfμ—λŠ” 더 λ‹€μ–‘ν•œ μ„œμ‹μ§€μ •μžκ°€ μžˆμœΌλ‚˜, ft_printfμ—μ„œ κ΅¬ν˜„ν•  μ„œμ‹μ§€μ •μž νƒ€μž…μ€ μ•„λž˜μ™€ κ°™λ‹€.

  • c : character , (va_arg type : int)
  • s : string , (va_arg type : string)
  • p: pointer (포인터 μ£Όμ†Œ) (va_arg type : long long)
  • d : signed int (va_arg type : int)
  • i : signed int (va_arg type : int)
  • u : unsigned int (va_arg type : unsigned int)
  • x / X : unsigned 16μ§„μˆ˜ (x와 XλŠ” 16μ§„μˆ˜μ˜ λŒ€μ†Œλ¬Έμž 차이) (va_arg type : unsigned int)

 

 

μ„œμ‹μ§€μ •μžμ—μ„œ d 와 i 의 차이

(d 와 i λŠ” printf μ—μ„œλŠ” 기본적으둜 κ°™μœΌλ‚˜, scanf μ—μ„œλŠ” 역할이 λ‹€λ₯΄λ‹€κ³  ν•œλ‹€. d : 10μ§„μˆ˜ μž…λ ₯λ°›μŒ, i : 10/8/16μ§„μˆ˜ μž…λ ₯ λ°›μŒ)

 

 

character의 va_arg νƒ€μž…μ΄ int인 이유

  • GCC(Cν‘œμ€€)μ—μ„œλŠ” κ°€λ³€μΈμžλ‘œ 받은 값이 int보닀 μž‘λ‹€λ©΄ intλ₯Ό μ§€μ •ν•΄μ•Όν•œλ‹€.
  • floatλŠ” double둜 μ§€μ •ν•΄μ•Ό ν•œλ‹€.

 

 

ν”Œλž˜κ·Έ

  • - : μ™Όμͺ½ μ •λ ¬ (기본값은 였λ₯Έμͺ½ 정렬이닀)
  • + : μ–‘μˆ˜μΌ λ•ŒλŠ” + λΆ€ν˜Έ, μŒμˆ˜μΌλ•ŒλŠ” - λΆ€ν˜Έ 좜λ ₯
  • (곡백) : μŒμˆ˜μΌλ•Œλ§Œ - λΆ€ν˜Έ 좜λ ₯
  • * : κ°€λ³€μΈμžλ‘œ 폭을 λ°›μ•„λ‚Έλ‹€.
  • 0 : 좜λ ₯ν•˜λŠ” 폭의 λ‚¨λŠ” 곡간을 0으둜 μ±„μ›Œλ„£λŠ”λ‹€.

 

 

폭

  • 숫자 : μ§€μ •ν•œ 숫자만큼 폭을 μ§€μ •ν•˜μ—¬ 좜λ ₯ν•œλ‹€. μ‹€μˆ˜λŠ” .(μ†Œμˆ˜μ ) , e+κΉŒμ§€ 폭에 ν¬ν•¨λœλ‹€.
  • 좜λ ₯ν•  값이 μ§€μ •ν•œ 폭보닀 μž‘μœΌλ©΄ 자릿수λ₯Ό λ§žμΆ”κΈ° μœ„ν•΄ 곡백 λ˜λŠ” 0을 μ±„μ›Œ λ„£λŠ”λ‹€.
  • 좜λ ₯값이 μ§€μ •λœ 폭 보닀 크닀면 폭은 λ¬΄μ‹œλœλ‹€.
  • width에 μŒμˆ˜κ°€ ν• λ‹Ήλ˜λ©΄ -ν”Œλž˜κ·Έ(μ’ŒμΈ‘μ •λ ¬) + width둜 κ°„μ£Όν•œλ‹€.
  • 폭은 * λ₯Ό μ΄μš©ν•˜μ—¬ κ°€λ³€μΈμžλ‘œλ„ 받을 수 μžˆλ‹€.

 

 

정밀도

  • 폭과 κ΅¬λΆ„λ˜λ„λ‘ μ•žμ— dot(.)을 찍어 μž…λ ₯ν•΄μ•Όν•œλ‹€.
  • 좜λ ₯ν•  κ°’μ˜ 정밀도λ₯Ό μœ„ν•œ μžλ¦Ώμˆ˜λ₯Ό μ„€μ •ν•œλ‹€.
  • ν˜•μ‹ λ¬Έμžμ—΄μ—μ„œ 정밀도λ₯Ό λ‚˜νƒ€λ‚΄μ§€λŠ” μ•Šμ§€λ§Œ λ’€μ— 인자둜 정밀도 값을 μ€€λ‹€. 이 λ•Œ μΈμžλŠ” ν˜•μ‹ νƒœκ·Έκ°€ μ μš©λ˜λŠ” 데이타 μ•žμ— μžˆμ–΄μ•Ό ν•œλ‹€.
  • 좜λ ₯κ°’ μ •μˆ˜(d, i)일 λ•Œ : μ„€μ •ν•œ 정밀도λ₯Ό λ§žμΆ”κΈ° μœ„ν•΄ 자릿수 만큼 0을 μΆ”κ°€ν•œλ‹€. 좜λ ₯κ°’μ˜ 길이기 더 κΈΈλ‹€λ©΄, μ •λ°€λ„λŠ” λ¬΄μ‹œλœλ‹€.
  • 좜λ ₯ν•  값이 μ‹€μˆ˜μΌ λ•Œ : 반올림 ν˜Ήμ€ μ†Œμˆ˜μ  μ΄ν•˜μ— 0을 λΆ™μ—¬μ„œ, 정밀도 만큼의 μ†Œμˆ˜μ  자리λ₯Ό 좜λ ₯ν•œλ‹€. μ‹€μˆ˜ μ „μ²΄μ˜ 자릿수 섀정은 widthμ˜΅μ…˜μ„ μ‚¬μš©ν•œλ‹€.
  • 정밀도에 μŒμˆ˜κ°€ ν• λ‹Ήλ˜λ©΄ λ¬΄μ‹œλœλ‹€.

 

ft_printf κ΅¬ν˜„μ‹œ κ³ λ €ν•  점

  • -ν”Œλž˜κ·Έμ™€ 0ν”Œλž˜κ·Έκ°€ 같이 μžˆλ‹€λ©΄ 0은 λ¬΄μ‹œλœλ‹€.
  • 정밀도와 0ν”Œλž˜κ·Έκ°€ 같이 μžˆμ–΄λ„ 0은 λ¬΄μ‹œλœλ‹€.
  • μ„€μ •ν•œ 폭보닀 좜λ ₯ν•  λ‚΄μš©μ΄ 더 κΈΈλ‹€λ©΄ ? 폭은 λ¬΄μ‹œλœλ‹€.
  • 폭은 *λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€λ³€μΈμžλ‘œ 값을 λ°›μ•„μ˜¬ μˆ˜λ„ μžˆλ‹€.
  • 정밀도도 *λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€λ³€μΈμžλ‘œ 값을 λ°›μ•„μ˜¬ 수 μžˆλ‹€.
  • 정밀도와 μ •μˆ˜λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄, '0'을 μ±„μ›Œλ„£μ–΄ 좜λ ₯λœλ‹€.