This project includes a custom implementation of a printf-like function in C, named ft_printf. 
The ft_printf function is a function that processes a formatted string and a variable number of arguments, converting and outputting the arguments based on the specified format.
int ft_printf(const char *, ...);- %c: Converts and outputs a single character.
 - %s: Converts and outputs a string.
 - %p: Converts and outputs a pointer address in hexadecimal format.
 - %d / %i: Converts and outputs a signed decimal integer.
 - %u: Converts and outputs an unsigned decimal integer.
 - %x: Converts and outputs a number in hexadecimal format with lowercase letters.
 - %X: Converts and outputs a number in hexadecimal format with uppercase letters.
 - %%: Outputs a literal percent sign.
 
The conversion and output for each format specifier is handled by a helper function ft_convert, which uses a variable argument list to retrieve the corresponding argument and pass it to the appropriate output function.
int	ft_convert(char c, va_list arg)
{
	if (c == 'c')
		return (ft_putchar(va_arg(arg, int)));
	else if (c == 's')
		return (ft_putstr(va_arg(arg, char *)));
	else if (c == 'p')
		return (ft_pointer(va_arg(arg, unsigned long)));
	else if (c == 'd' || c == 'i')
		return (ft_putnbr(va_arg(arg, int)));
	else if (c == 'u')
		return (ft_putunbr(va_arg(arg, unsigned int)));
	else if (c == 'x')
		return (ft_hexlower(va_arg(arg, int)));
	else if (c == 'X')
		return (ft_hexupper(va_arg(arg, int)));
	else if (c == '%')
		return (ft_putchar('%'));
	return (0);
}- ft_printf: Parses the format string and uses ft_convert to handle each conversion specifier.
 - ft_convert: Determines the type of conversion based on the format specifier and calls the appropriate function to handle the conversion and output.
 - ft_putchar
- Purpose: Outputs a single character.
 - Implementation: Uses the write system call to write the character c to the standard output (file descriptor 1).
 - Return Value: Always returns 1, indicating that one character was written.
 
 - ft_putstr
- Purpose: Outputs a string.
 - Implementation: Iterates through each character of the string str, using ft_putchar to output each character. If str is NULL, it outputs the string "(null)".
 - Return Value: Returns the number of characters written.
 
 - ft_hexlower
- Purpose: Outputs an unsigned integer in hexadecimal format with lowercase letters.
 - Implementation: Recursively divides the number nb by 16, using the remainder to determine the corresponding hexadecimal character from the string "0123456789abcdef".
 - Return Value: Returns the number of characters written.
 
 - ft_hexupper
- Purpose: Outputs an unsigned integer in hexadecimal format with uppercase letters.
 - Implementation: Similar to ft_hexlower, but uses the string "0123456789ABCDEF" to determine the hexadecimal characters.
 - Return Value: Returns the number of characters written.
 
 - ft_hexptr
- Purpose: Outputs an unsigned long integer in hexadecimal format with lowercase letters.
 - Implementation: Similar to ft_hexlower, but works with an unsigned long type.
 - Return Value: Returns the number of characters written.
 
 - ft_pointer
- Purpose: Outputs a pointer address in hexadecimal format.
 - Implementation: Outputs the prefix "0x" followed by the address in hexadecimal format using ft_hexptr.
 - Return Value: Returns the total number of characters written, including the "0x" prefix.
 
 - ft_putunbr
- Purpose: Outputs an unsigned decimal integer.
 - Implementation: Recursively divides the number nb by 10 to break it into individual digits, outputting each digit using ft_putchar.
 - Return Value: Returns the number of characters written.
 
 - ft_putnbr
- Purpose: Outputs a signed decimal integer.
 - Implementation: Handles the special case of the minimum integer value -2147483648 separately. For negative numbers, outputs the '-' sign and converts the number to positive. Recursively divides the number nb by 10 to break it into individual digits, outputting each digit using ft_putchar.
 - Return Value: Returns the number of characters written.
 
 
#include "ft_printf.h"
int main(void)
{
    ft_printf("Character: %c\n", 'A');
    ft_printf("String: %s\n", "Hello, World!");
    ft_printf("Pointer: %p\n", (void *)0x7ffee3bff6b8);
    ft_printf("Integer: %d\n", 42);
    ft_printf("Unsigned: %u\n", 42);
    ft_printf("Hex (lowercase): %x\n", 255);
    ft_printf("Hex (uppercase): %X\n", 255);
    ft_printf("Percent sign: %%\n");
    return 0;
}