Перед началом обязательно прочти сабж
Не лишнем будет и прочитать про структуры (бонусы без них не сделать)
В сабжекте говорится что бы мы использовали прототип:
int ft_printf (const char *, ...);
Если вас не смутила запись char * то вы не шарите в указателях - добро пожаловать на “мини” курс по указателям - Указатели ❎
В данном прототипе имеется ввиду, что мы можем использовать любое имя для указателя.
Я буду использовать str , а вы как хотите. Получаем вот такой прототип:
int ft_printf(const char *str, ...)
Сабжект разрешает использовать макросы va_start, va_arg, va_copy, va_end
Для их работы нужна библиотека stdarg.h
Эти макросы используют объект типа va_list , который также определен в stdarg.h и который позволяет обрабатывать списки параметров с не фиксированным количеством.
Что бы хоть примерно понять о чем идет реч, ознакомься со статьёй - Функции с переменным количеством параметров
Попробуем распечатать один символ используя va_list и макросы
#include <stdarg.h>
#include <unistd.h>
int ft_putchar(char c)
{
write(1, &c, 1);
return (1);
}
int ft_printf(const char *str, ...)
{
va_list ap;
va_start(ap, str);
return (ft_putchar(va_arg(ap, int)));
}
int main(void)
{
ft_printf("%с", '@');
return (0);
}
va_list это структура, ap - это объект структуры va_list, имя объекта может быть любым. Структура заполняется когда мы передадим объект структуры ap в макрос va_start.
Первый параметр макроса va_start это объект структуры который мы создали выше.
Второй параметр макроса - строка. Строкой является все что внутри кавычек первого аргумента функции ft_printf , в нашем случае строка - %с .
Все остальные аргументы у ft_printf, это список параметров. В примере выше у нас только один параметр, это символ @ который имеет тип char , но конкретно в этом случае, мы будем искать данный символ как тип int (кто знает почему, оставьте комент).
Макрос va_arg отправляет на печать в функцию ft_putchar первый параметр из функции ft_printf@Hello