형식 문자열(`format`)과 가변 인자(`...`)를 받아서, 형식 문자열에 지정된 대로 인자들을 출력하고, 출력된 문자의 총 길이를 반환합니다.
### 함수의 구조
1. **함수 시그니처**:
```c
int ft_printf(const char *format, ...)
```
- `const char *format`: 형식 문자열을 가리키는 포인터입니다. 이 문자열은 일반 문자와 형식 지정자(`%s`, `%d`, `%x` 등)를 포함할 수 있습니다.
- `...`: 가변 인자 리스트입니다. 형식 문자열에 따라 다양한 타입의 인자를 받을 수 있습니다.
2. **변수 선언**:
```c
int length = 0;
va_list pointer;
```
- `length`: 출력된 문자의 총 길이를 저장하는 변수입니다.
- `va_list pointer`: 가변 인자 리스트를 처리하기 위한 포인터입니다.
3. **가변 인자 리스트 초기화**:
```c
va_start(pointer, format);
```
- `va_start` 매크로는 `pointer`를 초기화하여 가변 인자 리스트의 첫 번째 인자를 가리키도록 합니다.
4. **형식 문자열 처리**:
```c
while (*format)
{
if ((*format == '%') && ((*(format + 1) == 's') || (*(format + 1) == 'd') || (*(format + 1) == 'x')))
{
format++;
if (*format == 's')
put_string(va_arg(pointer, char *), &length);
else if (*format == 'd')
put_digit((long long int)va_arg(pointer, int), 10, &length);
else if (*format == 'x')
put_digit((long long int)va_arg(pointer, unsigned int), 16, &length);
}
else
length += write(1, format, 1);
format++;
}
```
- `while (*format)`: 형식 문자열의 끝까지 반복합니다.
- `if ((*format == '%') && ...)`: 현재 문자가 `%`이고, 다음 문자가 `s`, `d`, `x` 중 하나인지 확인합니다.
- `format++`: `%` 다음의 형식 지정자를 처리하기 위해 포인터를 한 칸 이동합니다.
- `if (*format == 's')`: 형식 지정자가 `%s`인 경우, `put_string` 함수를 호출하여 문자열을 출력합니다.
- `else if (*format == 'd')`: 형식 지정자가 `%d`인 경우, `put_digit` 함수를 호출하여 정수를 10진수로 출력합니다.
- `else if (*format == 'x')`: 형식 지정자가 `%x`인 경우, `put_digit` 함수를 호출하여 정수를 16진수로 출력합니다.
- `else`: 형식 지정자가 아닌 일반 문자인 경우, `write` 함수를 사용하여 문자를 출력하고 `length`를 증가시킵니다.
- `format++`: 형식 문자열의 다음 문자로 이동합니다.
5. **가변 인자 리스트 정리 및 반환**:
```c
return (va_end(pointer), length);
```
- `va_end(pointer)`: 가변 인자 리스트를 정리합니다.
- `length`: 출력된 문자의 총 길이를 반환합니다.
### 주요 함수 및 매크로
- `va_list`: 가변 인자 리스트를 처리하기 위한 타입입니다.
- `va_start`: 가변 인자 리스트를 초기화합니다.
- `va_arg`: 가변 인자 리스트에서 다음 인자를 가져옵니다.
- `va_end`: 가변 인자 리스트를 정리합니다.
- `write`: 시스템 호출을 사용하여 문자를 출력합니다.
### 예제
```c
int main() {
ft_printf("Hello, %s! The answer is %d, or %x in hex.\n", "world", 42, 42);
return 0;
}
```
이 코드는 다음과 같이 출력됩니다:
```
Hello, world! The answer is 42, or 2a in hex.
```
### 결론
이 `ft_printf` 함수는 간단한 형식 지정자(`%s`, `%d`, `%x`)를 처리할 수 있는 기본적인 `printf` 함수의 구현입니다. 이 함수는 형식 문자열을 순회하면서 각 형식 지정자에 맞는 인자를 출력하고, 출력된 문자의 총 길이를 반환합니다. 이 코드는 가변 인자 리스트를 사용하여 다양한 타입의 인자를 처리하는 방법을 보여줍니다.
'C Language' 카테고리의 다른 글
read 함수 설명 (0) | 2025.02.27 |
---|---|
get_next_line 간단 구현 (0) | 2025.02.21 |
mlx_get_data_addr 펑션의 사용법 (0) | 2025.02.17 |
3D 표현에서 x,y 값과 z값의 의미 (0) | 2025.02.17 |
3D 축 기준 회전 공식 (0) | 2025.02.07 |