Skip to content
This repository has been archived by the owner on Aug 9, 2024. It is now read-only.
minjungk edited this page Jun 12, 2024 · 3 revisions

Welcome to the ft_printf wiki!

상성표

  • # : 진법에 맞게 맨 앞에 0, 0x, 0X 추가
  • : 양수일 땐 공백, 음수일 땐 - 출력 (+ 옵션있으면 무시됨)
  • + : 양수일 땐 +, 음수일 땐 - 출력 (default : 음수 부호만 표시)
  • 0 : width에 맞게 주어진 빈자리를 0으로 채움 (- 옵션있으면 무시됨)
  • - : width에 맞게 왼쪽 정렬. 빈자리를 공백으로 채움 (default : 우측 정렬)
타입 #   + 0 - width .precision
%% 무시 무시 무시 무시 무시 무시 무시
%c 무시 무시 무시 0 채우기 왼쪽 정렬 최소 버퍼 크기 무시
%s 무시 무시 무시 0 채우기 왼쪽 정렬 최소 버퍼 크기 최대 출력 개수
%d, %i 무시 변환 변환 precision만큼 0 채우기 왼쪽 정렬 최소 버퍼 크기 최소 출력 개수
%u 무시 무시 무시 precision만큼 0 채우기 왼쪽 정렬 최소 버퍼 크기 최소 출력 개수
%x, %X 변환 무시 무시 precision만큼 0 채우기 왼쪽 정렬 최소 버퍼 크기 최소 출력 개수
%p 무시 무시 무시 무시 왼쪽 정렬 최소 버퍼 크기 무시

구현

READ

  1. 플래그 설정
    • #, , 0, +, -인 경우 반복을 돌면서 플래그 설정
  2. width 설정
    • ft_atoi 함수를 사용하여 width 값 읽기
    • ft_isdigit 함수를 사용하여 width 만큼 주소 이동
    • 한 바이트 만큼 읽어서 type 저장
  3. type이 .인 경우 precision 설정
    • ft_atoi 함수를 사용하여 precision 값 읽기
    • ft_isdigit 함수를 사용하여 precision 만큼 주소 이동
    • 한 바이트 만큼 읽어서 type 저장

WRITE

사이즈 계산

int slen = ft_strlen(s);

if (type == 's')                     slen = precision;
if (type != 's' && precision < slen) precision = slen;

if (OPT_FOUND)            precision += 2; // "0x"
if (OPT_BLANK | OPT_FLUS) precision += 1; // ' ' '+'   (생략했지만, 음수 값인 경우도 포함)

if (width < precision) width = precision;

버퍼 생성 및 초기화

  • [ ] : width 만큼의 버퍼를 생성한 뒤 공백( )으로 초기화한다.
  • [000000 ] : 정렬 옵션에 따라 precision 만큼 0으로 초기화한다.
  • [000123 ] : 정렬 옵션에 따라 결과 값을 precision 위치에서 부터 채운다.
rtn = ft_calloc(width + 1, sizeof(char);
ft_memset(rtn, ' ', width);

if (OPT_ZERO && !OPT_PREC) precision = width;
if (OPT_MINUS) ft_memset(rtn, '0', precision);
else ft_memset(rtn + width - precision, '0', precision);

if (OPT_MINUS) ft_memcpy(rtn, s, slen);
else ft_mempcy(rtn + end - slen, s, slen);

타입 별 주의사항

  • %udx
    • 인자가 NULL이고 정밀도가 0으로 설정된 경우 아무것도 복사하지 않는다.
  • %s
    • 인자가 NULL이고 정밀도가 없으면 (null)을 복사한다.
    • 인자가 있는 경우 width 만큼의 버퍼를 할당하고 정밀도 만큼만 복사한다.
    char *s = va_arg(ap, char *);
    if (s == 0) s = "(null)";
Clone this wiki locally