[ft_printf](3)본 함수 구현
이번 포스트는 ft_printf(본 함수)에 관한 내용입니다.
1️⃣ ft_printf
- ft_printf과제는 libc(c 표준 라이브러리[C standard library])의 printf와 최대한 비슷하게 구현하는 과제입니다.
참고문서 > printf format_string 문서
2️⃣ ft_printf함수 기본틀 만들기
- 세부적으로 코드를 작성하기에 앞서 메인(본)함수가 되어줄 ft_printf함수를 임시로 구현했습니다.
(1) 일반 문자열만을 출력하는 임시 ft_printf 함수
#include <stdarg.h>
#include <unistd.h>
#include <stdio.h>
int ft_printf(const char *format, ...)
{
va_list ap;
int read_len;
va_start(ap, format);
{
while (*format != '\0')
{
if (*format != '%') // 서식자가 아닌 것은 그대로 출력
{
write(1, format++, 1);
read_len++;
}
else
format++;
}
}
va_end(ap);
return (read_len); // 출력한 갯수를 반환
}
int main(void)
{
int result;
result = ft_printf("%dHello\n");
printf("print_word is %d\n", result);
}
dHello
print_word is 7
(2) %(서식)일 경우 처리
- 위에 임시로 구현한 ft_printf에 else문을 좀 더 구체적으로 구현하겠습니다.
- 테스트에 사용할 main함수는 위의 main함수를 그대로 사용하였습니다.
< %(서식)일 경우 출력하는 else문(임시) >
else
{
++format;
read_form = set_form(ap, &format);
if (read_form < 0)
return (-1);
read_len += read_form;
}
- 서식 규칙은 너무 많기 때문에
set_form
이라는 함수에서 처리하도록 하였습니다. set_form
함수는 매개변수 포인터(ap)와 문자열의 주소(&format)를 인자로 받습니다.set_form
함수 또한 출력한 문자의 개수를 출력하도록 했습니다.- printf함수의 경우 오류가 났을시
-1
을 출력합니다.set_form
함수에서 에러가 났을 시 음수를 반환하도록 하였고 새롭게int
자료형인read_form
변수를 선언하여 오류처리 및read_len
변수를 업데이트할 수 있도록 처리하였습니다.
< set_form(임시)함수가 정상반환할 때>
int set_form(va_list ap, const char **format)
{
(*format)++;
return (1); // 1글자 출력성공(임시)
}
Hello
print_word is 7
< set_form(임시)함수가 오류를 반환할 때>
int set_form(va_list ap, const char **format)
{
(*format)++;
return (-1); //오류(-1)을 반환하도록 함
}
print_word is -1
3️⃣ 최종구현한 ft_printf함수(임시)
< ft_printf함수 >
int ft_printf(const char *format, ...)
{
va_list ap;
int read_len;
int read_form;
read_len = 0;
if (format == NULL) //printf(NULL);을 참고하여 추가해준 코드
return (-1);
va_start(ap, format);
{
while (*format != '\0')
{
if (*format != '%')
{
write(1, format++, 1);
read_len++;
}
else
{
++format;
read_form = set_form(ap, &format);
if (read_form < 0)
return (-1);
read_len += read_form;
}
}
}
va_end(ap);
return (read_len);
}