Giter Site home page Giter Site logo

ft_printf's Introduction

ft_printf (2021.01.31)

ft_printf 규칙 정리


1. ft_printf의 형식태그와 서식지정자

% [ flag ] [ width ] [ precision ] type
(필수) - , 0 10진 정수 혹은 * .10진 정수 혹은 .* cspdiuxX% (필수)

  • [ ] 는 필수 아닌 옵션
  • 만약 옵션이 들어온다면 flag, width, precision 순서대로 들어온다. (잘못된 인자 예외처리 X)



2. type - 필수

type 설명 va_arg
c 문자 int
s 문자열 char *
p 포인터 주소 long long
d, i 부호 있는 10진 정수 int
u 부호 없는 10진 정수 unsigned int
x, X 16진수 (소/대문자) unsigned int
% % 기호

  • 문자형은 char 형이 아니라 int 로 받는다.
  • 포인터 주소는 16진수로 이루어져 있다. (문자열 X)
  • type% 뒤에 반드시 나와야 한다. (잘못된 인자 예외처리 할 필요 X)
  • types일 때, 인자에 NULL 값이 들어오면, '(null)' 이라는 문자열을 출력해야한다. 이 문자열은 precisionwidth, - flag에 영향을 받는다.



3. flag - 옵션

flags 설명
- 왼쪽 정렬 (디폴트는 오른쪽 정렬)
0 typediuxX% 일 때 빈칸 대신 0 으로 채운다

  • flag 는 여러번 들어올 수 있다. 여러번 들어와도 한번만 들어온 것으로 인식한다.
  • 한가지 경우를 제외하고, -0는 동시에 들어올 수 없다. (만약 들어오면 컴파일 에러)
  • type% 일 때만, -0 이 같이 들어올 수 있는데, 이때는 들어온 순서에 상관없이 -0 보다 우선이다.
  • flag 0 은 숫자(diuxX)와 기호 %가 오른쪽 정렬(디폴트)일 경우만 적용된다.
    • 왼쪽 정렬일 경우 수가 달라지기 때문에 성립하지 않는다.
    • csp 일 경우 input 이 0 인 경우와 구분할 수 없어 성립하지 않는다.
    • di일 때, 만약 인자가 음수라면 0은 '-'와 숫자 사이('-' 뒤, 숫자 앞)에 채워지게 된다.



4. width - 옵션

width 설명
10진 숫자 양수만 가능하다. (0이면 0 flag로 인식하고, 음수면 - flag로 인식한다.)
* * 을 사용할 경우, 형식문자열이 아닌 가변인자에 정수를 적어줘야 한다. (10진 숫자와 같이 쓰일 수 없다.)

  • 만약 10진 정수에 '012'와 같이 '0'이 맨 앞에 들어간 수를 집어넣으면, 0 flag와 숫자 '12'로 나눠서 인식한다. 즉, width는 12로 적용된다.
  • * 의 경우 정수에 0이 들어오면 아무런 일도 하지 않는다. 음수가 들어올 경우, - flag와 양수로 나눠서 인식한다. ('-0'은 그냥 영으로 인식 된다.)
  • * 는 '10진 정수'와 달리 가변 인수 앞에 0을 붙여도 (예를 들어 '012') 앞의 '0'을 0 flag로 인식하지 않고 8진 정수로 인식하여 컴파일 에러가 난다.
  • width가 원래 출력할 문자열보다 작거나 같으면 (width <= len) 아무런 일도 하지 않고 원래 문자열을 그대로 출력한다. (만약 precision 옵션이 있다면 precision을 적용한 문자열 길이와 비교해야한다.)
  • typedi일 때, 만약 인자가 음수라면 문자열의 길이는 '-'를 포함한 길이이며, flag0이 들어왔다면 '-'와 숫자 사이('-' 뒤, 숫자 앞)에 '0'이 채워지게 된다. (예를 들어 %05d이고, 인자가 -123이라면, len은 4이고, 결과값은 -123 -> -0123 이다. precision 옵션과 다르므로 주의)
  • width > len 이면, 차이(len - width)만큼 앞의 flagprecision 에 따라 빈칸(혹은 0)이 채워진다. (오른쪽 정렬이 디폴트이므로 - flag가 없다면 빈칸이 왼쪽에 채워진다)
  • 0- flag가 동시에 들어온다면 - (왼쪽 정렬)가 우선이다.



5. precision - 옵션

precision 설명
. width의 10진 정수와 구분하기 위해 . 뒤에 10진 정수를 쓴다. (typecp% 인 경우, 옵션이 적용되지 않는다.)
.* .* 을 사용할 경우, 형식문자열이 아닌 가변인자에 정수를 적어줘야 한다. width* 과 구분하기 위해 . 뒤에 * 을 쓴다. (10진 정수와 함께 쓰일 수 없다.)

  • typecp% 인 경우, precision 옵션이 적용되지 않지만, *precision 을 받을 경우 적용하지 않더라도 가변인자를 받아야한다. (단, p일 때는 주소와 precision 이 모두 '0' 인 경우에 예외적으로 옵션에 영향을 받는다.)
  • precision 옵션을 사용할 경우. 0 flag는 무시한다. (단, 기호 %precision 옵션을 무시하므로, 0 flag를 무시할 수 없다.)
  • precision 을 먼저 적용하고, 그 길이를 width 값과 비교하여 최종적으로 출력한다. 이때 문자열(s)과 숫자(diuxX)의 처리가 다르다.
  • precision < 0
    • 문자열과 숫자 모두 precision 옵션이 없는 경우로 취급한다.
    • 따라서 precision이 음수인 경우, 0 flag도 무시하지 않는다.
  • precision == 0
    • 숫자(diuxX) : 원래 문자열을 그대로 출력.
      • 만약 숫자도 '0'이면 아무것도 출력하지 않는다. ('0' 출력X)
    • 문자열(s) : 아무것도 출력하지 않는다.
    • 포인터 주소(p) : NULL인 경우에만 '0x' 출력 ('0x0' 아님)
  • precision에 아무것도 입력되지 않은 경우, 즉 . 뒤에 * 도 10진 정수도 오지 않으면, precision == 0 인 경우와 동일하다.
  • 0 < precision < len
    • 숫자(diuxX) : 원래 문자열을 그대로 출력.
    • 문자열(s) : len 만큼 잘려서 출력. 앞에서 부터 출력되며, 뒤가 잘린다. (예를 들어 precision이 4이고 len이 5라면, "abcde" -> "abcd" )
  • 0 < len < precision
    • 숫자(diuxX) : 차이(precision - len)만큼 숫자 앞에 0이 채워진다. 숫자가 음수일 경우 width가 길이를 재는 방식과 달리 '-'를 제외하고 숫자의 길이만을 재며, 0은 '-' 부호와 숫자 사이에 들어간다. (예를 들어 precision이 5이고 인자가 -123이라면, len은 3이고, 결과값은 -123 -> -00123 이다.)
    • 문자열(s) : 원래 문자열을 그대로 출력.
  • 조건에 따라 새로 만들어진 새로운 문자열 길이(예를 들어, "abcde" -> "abcd" 또는, -123 -> -00123)를 width와 비교한 뒤, 조건에 맞춰 출력한다. -0 flag도 놓치지 말고 고려할 것.

ft_printf's People

Contributors

jiwon-woo avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.