다시 갈아엎었다.
이 전까지는 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);
위 코딩처럼 형변환을 해준다.