---
# System prepended metadata

title: '2 ft_printf : 기본 Structure'
tags: [ft_printf]

---

---
Category : ft_printf
Id : 2
Title : "ft_printf : 기본 Structure"
Description : "ft_printf의 구조를 어떻게 할지 고민해보자"
Date : 2020, 10, 23 (Fri)
Auther : seolim
pre : 1
next : 0
tags : ft_printf
---

# 2 ft_printf : 기본 Structure
> Link

[link not yet]()

> Caution

본 문서를 포함한 블로그의 모든 내용은 <b>42 innovation academy</b>의 과제의 작성자의 해석 및 풀이 등으로 이루어져 있습니다.</br>본인이 42 교육생이거나 42 교육을 희망하는 분이라면 글을 먼저 보기보다는 고민해보고 읽어보기를 추천드립니다.


> 목적

ft_printf의 구조를 어떻게 구성할 것인지 고민해보자.

1. 프로그램을 짜기 전 프로그램을 어떻게 구성할 지 고민해본다.


> ft_print의 구성을 어떻게 할까?

`printf`의 기능은 크게 파싱(parsing)과 출력(print)로 볼 수 있다. input으로 받은 string을 파싱하고 지정된 방식으로 output을 화면에 출력한다.</br></br>2가지 방법을 일단 생각할 수 있다.

1. **input을 전체 다 파싱하는 동안 변경된 문자열을 저장해 두다가 파싱이 끝난 후 완성된 문자열을 출력하는 방법**
2. **input을 파싱하면서 변경된 문자열을 바로바로 출력하는 방법**

두 방법 모두 방식은 파싱을 진행하고 출력을 하는것은 동일하나 구성에 차이가 존재한다. 아래 수도코드(persudo code)를 보면 차이를 대략 눈치챌 것이다.

```javascript
/*
* print = 출력 기능
* parsing = 파싱 기능
* input = 들어온 str
* output = 파싱된 str
* temp = 저장된 임시 str
*/
// 1 방법
loop :
    output = parsing(*input)
    input++;
    temp += output;
    
print(temp)
    
// 2 방법
loop :
    output = parsing(*input)
    input++;
    print(output)

```

1 방법은 parsing이 진행되는 scope와 print가 진행되는 scope가 분리되어 기능적으로 분리가 잘 되어있으나, 메모리를 하나 더 사용하여 자원이 더 필요하다.</br>2 방법은 한 loop안에 parsing과 print가 한번에 진행되므로 더 간단히 작성할 수 있으나 기능 분리가 약해 디버그나 프로그램 확장시 서로 영향을 미칠 가능성이 높다.</br></br>어떠한 방식을 채택하던 그 이유가 명확해야하고 상황에 따라 개발자는 구조를 어떤식으로 하는것이 효율적인지 고민을 많이 하여야 한다.앞으로의 설명은 방법 2를 기준으로 진행된다.

> 기본 골조

```c
int ft_printf(const char *str, ...)
{
    va_list args;
    char *output;
    int len;
    
    va_start(args, str);
    while (str)
    {
        if (*str == '%')
        {
            output = parsing(&str, args);
            len += write(1, output, strlen(output));
        }
        else 
            len += write(1, str, 1);
        str++;
    }
    return (len);
}
```

Main process를 위와 같이 구조화 해 보았다. 해당 코드를 살펴보면 input으로 받은 문자열에 %가 발견되지 않으면 출력(`write`)를 바로 진행하고 발견되면 parsing을 통해 원하는 형태로 문자열을 만든 후 출력을 진행한다. 다음번엔 parsing내부를 어떻게 구현할 지 고민해보자