Subject

ft_printf (старый subject)


Перед началом обязательно прочти сабж

Не лишнем будет и прочитать про структуры (бонусы без них не сделать)

В сабжекте говорится что бы мы использовали прототип:

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