라이브러리 사용해서 컴파일
cc main.c -L./ -lftprintf
터미널 명령어
vim 명령어
ft_printf.h
#ifndef FT_PRINTF_H
# define FT_PRINTF_H
# include <stdarg.h>
# include <stdio.h>
# include <unistd.h>
# include <stdlib.h>
int ft_printf(const char *str, ...);
int ft_putchar(char c);
int ft_putstr(char *str);
int ft_itoa(int i);
int ft_uitoa(int n);
int ft_puthex(int i, char x);
int ft_putpointer(unsigned long long l);
#endif
ft_printf.c
#include "ft_printf.h"
int callspecifier(char c, va_list args)
{
unsigned long long p;
if (c == 'c')
return (ft_putchar((char)va_arg(args, int)));
else if (c == 's')
return (ft_putstr(va_arg(args, char *)));
else if (c == 'x' || c == 'X')
return (ft_puthex(va_arg(args, int), c));
else if (c == '%')
return (ft_putchar('%'));
else if (c == 'd' || c == 'i')
return (ft_itoa(va_arg(args, int)));
else if (c == 'u')
return (ft_uitoa(va_arg(args, int)));
else if (c == 'p')
{
p = va_arg(args, unsigned long long);
if (p == 0)
return (ft_putstr("0x0"));
else
return (ft_putstr("0x") + ft_putpointer(p));
}
return (0);
}
int ft_printf(const char *str, ...)
{
va_list args;
int i;
int sum;
if (!str)
return (0);
va_start(args, str);
i = 0;
sum = 0;
while (str[i])
{
if (str[i] == '%')
{
i++;
if (!str[i])
break ;
sum += callspecifier(str[i], args);
}
else
sum += ft_putchar(str[i]);
i++;
}
va_end(args);
return (sum);
}
ft_putchar.c
#include "ft_printf.h"
int ft_putchar(char c)
{
write(1, &c, 1);
return (1);
}
ft_putstr.c
#include "ft_printf.h"
int ft_putstr(char *str)
{
int i;
i = 0;
if (!str)
str = "(null)";
while (str[i])
{
ft_putchar(str[i]);
i++;
}
return (i);
}
ft_itoa.c
#include "ft_printf.h"
static long countdigit(long n)
{
int i;
i = 1;
while (n > 9)
{
n = n / 10;
i++;
}
return (i);
}
static void putnbr(long n)
{
if (n > 9)
putnbr(n / 10);
ft_putchar(n % 10 + '0');
}
int ft_itoa(int n)
{
long l;
int size;
size = 0;
l = n;
if (l < 0)
{
ft_putchar('-');
l *= -1;
size += 1;
}
size += countdigit(l);
putnbr(l);
return (size);
}
int ft_uitoa(int n)
{
unsigned int u;
int size;
size = 0;
u = (unsigned int)n;
size += countdigit(u);
putnbr(u);
return (size);
}
ft_puthex.c
#include "ft_printf.h"
int charcount(unsigned long long nb)
{
int i;
i = 1;
while (nb >= 16)
{
nb = nb / 16;
i++;
}
return (i);
}
void putnbr_base(unsigned long long nb, char *base)
{
if (nb >= 16)
putnbr_base((nb / 16), base);
ft_putchar(base[nb % 16]);
}
int ft_puthex(int i, char x)
{
char *base;
int sum;
unsigned int c;
base = "0123456789abcdef";
if (x == 'X')
base = "0123456789ABCDEF";
sum = 0;
c = (unsigned int)i;
putnbr_base(c, base);
sum += charcount(c);
return (sum);
}
int ft_putpointer(unsigned long long l)
{
char *base;
int sum;
base = "0123456789abcdef";
sum = 0;
putnbr_base(l, base);
sum += charcount(l);
return (sum);
}
Makefile
NAME = libftprintf.a
cc = gcc
CFLAGS = -Wall -Wextra -Werror
SRCS = \
ft_printf.c \
ft_putchar.c \
ft_putstr.c \
ft_itoa.c \
ft_puthex.c
OBJS = $(SRCS:.c=.o)
all: $(NAME)
$(NAME): $(OBJS)
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $^
ar crsu $(NAME) $@
clean:
rm -f $(OBJS)
fclean: clean
rm -f $(NAME)
re: clean all
.PHONY: all clean fclean re
main.c (테스트용)
#include "ft_printf.h"
int main(void)
{
printf("%c \n", 'a');
printf("%s \n", "abc");
printf("%p \n", (void *)42);
printf("%d %i \n", 42, 42);
printf("%u \n", 42);
printf("%x %X \n", 42, 42);
printf("%% \n\n");
ft_printf("%c \n", 'a');
ft_printf("%s \n", "abc");
ft_printf("%p \n", (void *)42);
ft_printf("%d %i \n", 42, 42);
ft_printf("%u \n", 42);
ft_printf("%x %X \n", 42, 42);
ft_printf("%% \n");
return 0;
}
cc -Wall -Wextra -Werror ft_printf.c ft_putchar.c ft_putstr.c ft_itoa.c ft_puthex.c main.c