[1 Circle] ft_printf 문제 설명 및 해결 방법

Suffergo·2021년 2월 15일
0

42seoul - 1 Circle

목록 보기
3/4
post-thumbnail

- 문제 설명

  • 프로토 타입 : int ft_printf(const char *format, ...);
  • format은 서식 문자열이며, ...은 생략기호로 인수 갯수, 타입을 점검하지 않도록 한다.
  • printf 함수 구현
  • cspdiuxX%의 서식지정자들을 구현

- man 3 printf

- 용어 및 문제 추가 설명

✓ 가변함수(External functs.) #include <stdarg.h>

  • va_start : 가변인자를 va_list로부터 가져올 수 있도록 포인터를 설정
  • va_arg : 자료형의 크기만큼 가변인자 목록 포인터에서 값을 가져옴
  • va_copy :
  • va_end : 가변인자 처리가 끝났을 때 포인터를 NULL로 초기화

✓ Pirntf 옵션

  • %flag/width/.precision/type

+ flags

  • 출력 값 앞에 표시할 문자를 설정하는 영역
  • 생략 가능
  • 여러 flag 동시 사용 가능
  • 보너스
  • + : 인수가 양수거나 0일때 + 부호를 출력
  • - : 왼쪽 정렬
  • 0 : 오른쪽 정렬일 때, 공백을 0으로 채움
  • # : 진수 표현
  • * : 출력너비를 인자로받아서 출력

+ width

  • 출력할 값의 최소 너비를 지정
  • 출력할 값이 지정할 너비보다 작으면 자릿수를 맞추기 위해 공백 또는 0을 채워넣는다.
  • 출력할 값이 너비보다 클 경우, 값이 잘리는 일은 있을 수 없으므로 width 옵션은 무시됨

+ width 예시

printf("[%4d]\n", 123); // [ 123]
// width = 4, 값은 오른쪽 정렬되고 남은 너비를 공백으로 채워서 출력
printf("[%04d]\n", 123); // [0123]
// flag = '0', width = 4, 값은 오른쪽 정렬되고, 남은 너비에 0을 채워서 출력
printf("[%-4d]\n", 123); // [123 ]
// flag = '-', width = 4, 값은 왼쪽 정렬되고 남은 너비에 공백을 채워서 출력

+ precision

  • 출력할 값의 정확도를 위한 최대 자릿수를 설정
  • 출력할 값이 정수라면 최대 자릿수를 맞추기 위해 0을 추가
  • 자릿수가 출력할 값보다 작을 경우, 값을 자르거나 하지 않고 값을 모두 출력
  • 출력할 값이 실수라면 소수점 이하의 최대 자릿수를 가리키고, 자릿수에 따라 반올림이 되거나 소수점 이하에 0이 추가됨
  • 실수 전체의 자릿수 설정은 width 옵션을 사용

+ precision 예시

printf("[%013.6f]\n", 123.456); // [000123.456000]
// flag = '0', width = 13, precision = 6
// 소수점을 6째 자리까지 출력하며 소수점 이하 0추가, 남은 너비에 0을 넣어서 오른쪽 정렬

type

  • 숫자(number), 문자(character), 문자열(string) 중의 하나
  • 숫자는 정수와 실수로 나뉘며, 정수는 다시 부호의 유무로 나뉨
  • 정수는 8,10,16진수 형태로 출력 가능
  • 실수는 일반적인 표기법 이외에 지수(exponent) 표기법으로 출력 가능
  • 타입 문자
    • %u : 10진수로 2바이트 출력/부호 없는 정수
    • %d : 10진수로 2바이트 출력/부호 있는 정수
    • %o : 8진수로 2바이트 출력/부호 없는 8진수 정수
    • %x : 16진수로 2바이트 출력. 부호 없는 16진수 정수(소문자)
    • %X : 16진수로 2바이트 출력. 부호 없는 16진수 정수(대문자)
    • %c : 단일문자 1바이트 출력
      • 0플래그 Warning, - 플래그 적용됨, * 플래그 적용됨
      • width 영향 받음
      • precision Warning
    • %s : 문자열 출력
    • %p : 포인터의 메모리주소
    • %i : 부호있는 10/8/16진수

- 함수 작성시 주의점

  • %%의 입력을 통한 '%'의 출력
  • 옵션이 등장하는 순서와 여러 개 옵션의 사용
  • flag가 여러개 들어올 경우

- 해결 방법 및 구성

%[플래그:+-0(공백)*#][너비][.정밀도][길이수정자:l ll h hh][서식지정자:diuxXcsp%onfge]
0. 외부라이브러리 컴파일
1.

빨강색은 보너스

✓ 어쩌지?

  • 가변 인자의 활용방법
  • 외부라이브러리를 참조한 컴파일 방법(libft Make)
  • 구조체를 활용하여 저장

- 예외처리

  1. 플래그의 중첩
  2. ft_printf는

- 사용 tester

  • printf_lover

- Bonus!

- main 테스트 코드

참고 : https://watermelonlike.tistory.com/44
https://dojang.io/mod/page/view.php?id=736
http://blog.naver.com/PostView.nhn?blogId=ksm_ani&logNo=222168553078&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

profile
파도가 칠 때는 서핑을

0개의 댓글