ft_printf_7일차

아따맘마·2020년 11월 23일
0

ft_printf

목록 보기
8/9

다시 갈아엎었다.
이 전까지는 char *str이라는 변수에 malloc을 이용하여 출력할 문자열의 크기에 맞게 배열을 만든 후 하나하나 채워넣는 식으로 했었는데... 도저히 옵션이 많아지자 다 구현하기가 어려워져서 새로운 방법으로 구현하였다.

수정한 부분

기존은 배열을 생성해서 했다면 이제는 그냥 바로 출력하는 식으로 했다.
출력하면서 출력 문자열 길이도 추가해줘야 하므로 ft_putchar()을 int 반환형으로 해주면서 1을 반환하게 수정했다.
공백이나 0을 출력하는 길이는 ft_size파일에서 따로 함수를 만들어줘서 결정해줬다.

숫자일 경우

출력 숫자의 길이가 widthprecision보다 길다면 둘 다 0으로 초기화해줬다.

prec가 width보다 큰 경우

prec길이에서 문자열만큼 빼준다. 그 다음에 만약 출력할 숫자가 음수거나 plus 옵션으로 부호를 같이 출력해준다면 이미 문자열에 부호만큼의 길이 1이 더 추가됬으므로 prec에는 +1을 해준다.
ex) -2 출력, prec = 4
만약 +1을 해주면 prec = 2가 되서 0이 두개밖에 출력이 안된다. 원래대로라면 004가 출력

printf을 가지고 확인해보면 다음과 같이 출력되는것을 확인할 수 있다.

prec보다 width가 큰 경우


widthprec보다 크다고 prec를 0으로 초기화해주면 안된다. 위 경우처럼 prec만큼 0을 출력해주기 때문이다.
그래서 width출력 숫자 길이prec만큼 빼준다.

문자(열)일 경우

문자(열)은 Flag-옵션만 사용이 되고 Precision은 안쓰이고 width만 쓰인다. 그래서 숫자보다 더 간단하다.

문자

숫자나 문자열일 경우 따로 파일을 만들어서 크기 옵션을 수정해줬지만 문자는 그럴 필요가 없다. 무조건 출력 길이는 1이기 때문이다. 그리고 width만 쓰이기 때문에 width가 0이 아닌 경우엔 -1을 해준다.

문자열

문자열은 숫자보다 더 간단하다. widht만 따져주면 되기 때문에 출력 문자열 길이가 width보다 크면 width는 0으로 초기화, 그 반대면 width에서 출력 문자열 길이만큼 빼준다.

가변인자(추가부분)

가변인자에서 va_arg에 쓰이는 옵션(?)들은 다음과 같다.

  • char or short : int로 대체
  • float : double로 쓴 다음에 이후에 형변환을 해줘야 한다.
char ch = (char)va_arg(ap, int);
float f = (float)va_arg(ap, double);

위 코딩처럼 형변환을 해준다.

profile
늦게 출발했지만 꾸준히 달려서 도착지점에 무사히 도달하자

0개의 댓글