ft_printf_5일차

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

ft_printf

목록 보기
6/9

ft_isnum()

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에 담고 반환

ft_print_d()

이제 진짜 출력하는 부분을 코딩해보자. 가장 처음으로 도전해볼 것은 정수형 d출력.
자, 한번 천천히 생각해봅시다.

ft_printf("%*.*d", 5, 6, 3);

Flag에서 주의점

	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에서 여러가지 경우의 수를 가지고 출력을 해봤다.

1. Width와 Precision이 같이 있을 경우

  1. Widthprecision이 클 경우
	printf("%*.*d\n", 5, 3, i);

공백공백공백001와 같이 출력된다. 전체 문자열 길이는 width만큼 지정이 되고 precision만큼 0이 출력
2. 그 반대일 경우

	printf("%*.*d\n",3, 5, i);

000001으로 출력. 전체 길이도 precision만큼 지정이 되고 0도 출력 문자열 제외한 만큼 출력이 된다.

2. Width와 Precision이 출력 문자열보다 작을때

그럼 이 둘은 그냥 무시된다.

3. 0과 -이 같이 존재할 경우

0은 무시되고 출력물은 왼쪽 정렬한 상태로 출력이 된다.

4. +와 공백이 같이 존재할 경우

공백은 무시되고 +옵션만 실행

  • 하다가 수정한 부분
    ft_print_d처럼 서식지정자 출력 함수를 void로 했었는데 이 부분 오류시 에러를 반환할 부분이 보이지 않아 int혐 함수로 지정해주었다. 출력이 성공하면 SUCCESS로 에러가 뜨면 ERROR로 반환

%d 출력 부분

맨 처음 생각은 char *str을 ft_strdup로 ""초기화시켜준 다음에 ft_strjoin()을 통해 진행하려고 했다. 그런데 그러기엔 복잡해질거 같아서 char *str을 malloc을 통해 크기만큼 배열을 생성하고 그 배열안에서 처리를 해주려고 한다.

ft_size_str()

ft_printf_d()에서 변수 char *str을 생성하고 이 함수내에서 malloc을 통해 배열을 설정
크기를 설정할 때 Width옵션과 Precision의 크기를 따지고 난 후 printf_d()함수에서 char *n에 ft_itoa(va_arg(ap, int))로 문자열을 넣은 변수의 크기랑 비교해서 가장 큰 size로 malloc을 실행.
만약 malloc이 실패한다면 ERROR을 반환.

ft_d_flag()

flag를 처리하는 함수. 여기서부터 예외사항을 많이 따져줘야 한다.

  • +기호가 있으면 +옵션을 처리해주고, 공백 옵션만 있으면 공백 옵션을 처리해주고 둘 다 있으면 +옵션만 처리해준다.
  • left옵션이 있으면 str배열에 숫자 문자열 n이 끝날때까지 담아주면 된다.
  • -옵션과 0옵션이 같이 있으면 0옵션은 무시된다.

일단 초안으로 이정도만 알고 있다는 가정 하에 코드를 짜보기로 했다.

fd_d_prec()

이 함수에서는 정확도를 지정해주면 된다. 정수형 출력에서 정확도는 출력할 숫자 크기를 제외한 나머지 부분을 0으로 채워주면 된다.

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

0개의 댓글