개요
- 나만의 printf()를 작성하는 과정
- 역시 파일을 묶어서 하나의 라이브러리로 생성하면 된다.
요구사항
- 원래 printf의 버퍼 관리를 이식하지 말 것.
- 다음 기호를 printf처럼 인식할 것 : cspdiuxX%
- ar을 이용해서 라이브러리를 만들 것 (makefile 쓰라는 이야기)
- root directory에 만들어져야 함.
필수파트
printf가 하는 역할을 생각해보자.
c
printf("hello world") // 단순 텍스트 출력
printf("%d", x). // 포메팅
printf("hello!\n"). // 이스케이프 문자
- 단순 텍스트 출력
- 포메팅
- 이스케이프
- 출력값은 출력한 문자의 갯수. 실패 시 -1을 반환한다.
개념파악 및 설계
포매팅을 하기 위해 필요한 것은 인자(parameter).
그런데, 인자의 갯수가 변할 수 있으므로 가변인자를 써야 함.
따라서, 전반적인 구조는 다음과 같다.
-
텍스트를 반복문으로 돌린다.
-
글자수를 세는 cnt를 선언 및 초기화한다.
-
만약 텍스트가 ‘%’를 만나면
- 한 칸 다음 값, 그리고 n번째 인자, cnt를 넘겨준다.
- 한 칸 다음 값의 종류에 따라 값이 달라진다.
-
나머지 텍스트는 문자 단위로 출력하면서, 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면 대문자)%%: 그냥 % 출력
예외처리 부분
printf("%s", (char *)NULL)일 때- 이 경우에
str == NULL일때의 예외 케이스를 만들어주면 된다.
- 이 경우에
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진수, 포인터 관련 서식지정자 출력