int ft_isnum(char **format)
{
int res;
res = 0;
if (**format >= '0' && **format <= '9')
{
res = res * 10 + (**format - '0');
(*format)++;
}
return (res);
}
4일차에 is_num에 관해 ft_strdup()와 ft_strjoin()함수를 이용해서 width와 precision을 판단할 때 숫자를 넘기는 함수를 만들려고 했다.
그런데 더 간단하게 할 수 있을 듯 해서 res 정수형 변수를 만든다음 계속 해당 숫자를 더해가면서 최종적으론 모든 숫자를 res에 담고 반환
이제 진짜 출력하는 부분을 코딩해보자. 가장 처음으로 도전해볼 것은 정수형 d
출력.
자, 한번 천천히 생각해봅시다.
ft_printf("%*.*d", 5, 6, 3);
int i = 1;
printf("%*d\n",3, i);
printf("%.*d\n",5, i);
printf("%*.*d\n",3, 5, i);
printf("%*.*d\n", 5, 3, i);
printf("%*d\n",3, 1234);
printf("%.*d\n",3, 1234);
printf("%-*d\n", 6, 3);
printf("%0*d\n", 6, 3);
printf("%+ d\n", 1);
printf에서 여러가지 경우의 수를 가지고 출력을 해봤다.
Width
가 precision
이 클 경우 printf("%*.*d\n", 5, 3, i);
공백공백공백001와 같이 출력된다. 전체 문자열 길이는 width만큼 지정이 되고 precision만큼 0이 출력
2. 그 반대일 경우
printf("%*.*d\n",3, 5, i);
000001으로 출력. 전체 길이도 precision만큼 지정이 되고 0도 출력 문자열 제외한 만큼 출력이 된다.
그럼 이 둘은 그냥 무시된다.
0은 무시되고 출력물은 왼쪽 정렬한 상태로 출력이 된다.
공백은 무시되고 +옵션만 실행
- 하다가 수정한 부분
ft_print_d처럼 서식지정자 출력 함수를 void로 했었는데 이 부분 오류시 에러를 반환할 부분이 보이지 않아 int혐 함수로 지정해주었다. 출력이 성공하면 SUCCESS로 에러가 뜨면 ERROR로 반환
맨 처음 생각은 char *str을 ft_strdup로 ""
초기화시켜준 다음에 ft_strjoin()을 통해 진행하려고 했다. 그런데 그러기엔 복잡해질거 같아서 char *str을 malloc을 통해 크기만큼 배열을 생성하고 그 배열안에서 처리를 해주려고 한다.
ft_printf_d()에서 변수 char *str을 생성하고 이 함수내에서 malloc을 통해 배열을 설정
크기를 설정할 때 Width
옵션과 Precision
의 크기를 따지고 난 후 printf_d()함수에서 char *n에 ft_itoa(va_arg(ap, int))로 문자열을 넣은 변수의 크기랑 비교해서 가장 큰 size로 malloc을 실행.
만약 malloc이 실패한다면 ERROR을 반환.
flag를 처리하는 함수. 여기서부터 예외사항을 많이 따져줘야 한다.
일단 초안으로 이정도만 알고 있다는 가정 하에 코드를 짜보기로 했다.
이 함수에서는 정확도를 지정해주면 된다. 정수형 출력에서 정확도는 출력할 숫자 크기를 제외한 나머지 부분을 0으로 채워주면 된다.