다시 갈아엎었다.
이 전까지는 char *str이라는 변수에 malloc을 이용하여 출력할 문자열의 크기에 맞게 배열을 만든 후 하나하나 채워넣는 식으로 했었는데... 도저히 옵션이 많아지자 다 구현하기가 어려워져서 새로운 방법으로 구현하였다.
기존은 배열을 생성해서 했다면 이제는 그냥 바로 출력하는 식으로 했다.
출력하면서 출력 문자열 길이도 추가해줘야 하므로 ft_putchar()을 int 반환형으로 해주면서 1을 반환하게 수정했다.
공백
이나 0
을 출력하는 길이는 ft_size파일에서 따로 함수를 만들어줘서 결정해줬다.
출력 숫자의 길이가 width
와 precision
보다 길다면 둘 다 0으로 초기화해줬다.
prec
길이에서 문자열만큼 빼준다. 그 다음에 만약 출력할 숫자가 음수거나 plus
옵션으로 부호를 같이 출력해준다면 이미 문자열에 부호만큼의 길이 1이 더 추가됬으므로 prec
에는 +1을 해준다.
ex) -2 출력, prec = 4
만약 +1을 해주면 prec
= 2가 되서 0이 두개밖에 출력이 안된다. 원래대로라면 004가 출력
printf을 가지고 확인해보면 다음과 같이 출력되는것을 확인할 수 있다.
width
가 prec
보다 크다고 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);
위 코딩처럼 형변환을 해준다.