[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_printfelse문을 좀 더 구체적으로 구현하겠습니다.
  • 테스트에 사용할 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);
}




© 2021.02. by kirim

Powered by kkrim