열렬히.뛰기

ft_printf

개요

  • 나만의 printf()를 작성하는 과정
  • 역시 파일을 묶어서 하나의 라이브러리로 생성하면 된다.

요구사항

  1. 원래 printf의 버퍼 관리를 이식하지 말 것.
  2. 다음 기호를 printf처럼 인식할 것 : cspdiuxX%
  3. ar을 이용해서 라이브러리를 만들 것 (makefile 쓰라는 이야기)
  4. root directory에 만들어져야 함.

필수파트

printf가 하는 역할을 생각해보자.

c
printf("hello world") // 단순 텍스트 출력
printf("%d", x).      // 포메팅
printf("hello!\n").   // 이스케이프 문자
  1. 단순 텍스트 출력
  2. 포메팅
  3. 이스케이프
  4. 출력값은 출력한 문자의 갯수. 실패 시 -1을 반환한다.

개념파악 및 설계

포매팅을 하기 위해 필요한 것은 인자(parameter).

그런데, 인자의 갯수가 변할 수 있으므로 가변인자를 써야 함.

따라서, 전반적인 구조는 다음과 같다.

  1. 텍스트를 반복문으로 돌린다.

  2. 글자수를 세는 cnt를 선언 및 초기화한다.

  3. 만약 텍스트가 ‘%’를 만나면

    1. 한 칸 다음 값, 그리고 n번째 인자, cnt를 넘겨준다.
    2. 한 칸 다음 값의 종류에 따라 값이 달라진다.
  4. 나머지 텍스트는 문자 단위로 출력하면서, cnt를 센다. (ft_putstr 이용)

    이스케이프 문자 + (문자)는 알아서 읽어준다. (처리해줄 필요 없음)

가변인자

가변인자를 넣어줘야 한다. 다음과 같은 방식으로 작동한다.

mermaid
flowchart LR

node(text)
n2(인자 1)
n3(인자 2)
last(인자 n)
node-->n2-->n3-.->last

서식지정자

(% + 지정 문자)를 의미한다.

  • %s : 문자열
  • %i : %d와 차이가 없음. (원래 integer을 의미하지만, 여기서는 10진수로 처리)
  • %p : 포인터 → 주소값을 보낸 뒤 16진수로 변환한다.
  • %x : 16진수로 변환 (X면 대문자)
  • %% : 그냥 % 출력

예외처리 부분

  1. printf("%s", (char *)NULL) 일 때
    • 이 경우에 str == NULL일때의 예외 케이스를 만들어주면 된다.
  2. printf("%c", "") 인 경우
    • 온점(.)을 출력한다.

조건 : write() 실패 시 -1 반환하기

  • write()의 반환 타입 : ssize_t
  • 따라서 write()의 출력값이 -1이면 모조리 return하면 된다.
  • 모든 함수에 이를 적용

c 파일, 헤더, make

util3

헤더파일

makefile

  • myprintf.c : ft_printf() + 포메팅 조건문 + %% 일때 처리
  • util.c : 문자, 문자열 관련 서식지정자 출력
  • util2.c : 숫자 관련 서식지정자 출력
  • util3.c : 16진수, 포인터 관련 서식지정자 출력