This project has been created as part of the 42 curriculum by muhamoz
Bu proje C dilindeki standart printf() fonksiyonunu yeniden kodlama (recode) işlemidir. Amaç, C'nin variadic fonksiyonlarını (değişken sayıda parametreyi kabul eden fonksiyonlar) öğrenmek ve ustalaşmaktır.
Projede ft_printf() isimli bir kütüphane fonksiyonu yazılmış olup, aşağıdaki format specifier'larını desteklemektedir:
| Specifier | Açıklama |
|---|---|
%c |
Tek bir karakter yazdırır |
%s |
String yazdırır (NULL ise "(null)" yazar) |
%p |
void* pointer'ı hexadecimal formatında yazdırır (0x ile başlar, NULL ise "(nil)" yazar) |
%d |
Decimal (10'luk tabanda) sayı yazdırır |
%i |
Integer (10'luk tabanda) yazdırır |
%u |
Unsigned decimal sayı yazdırır |
%x |
Hexadecimal (16'lık tabanda) sayı yazdırır (küçük harf: a-f) |
%X |
Hexadecimal (16'lık tabanda) sayı yazdırır (büyük harf: A-F) |
%% |
Yüzde işareti (%) yazdırır |
Projeyi derlemek için:
makeBu komut libftprintf.a statik kütüphanesini oluşturur.
#include "ft_printf.h"
int main(void)
{
ft_printf("Hello %s, sayı: %d\n", "World", 42);
return (0);
}Derleme:
cc program.c libftprintf.a -o program
./programmake all- Kütüphaneyi derlermake clean- .o dosyalarını silermake fclean- .o dosyalarını ve libftprintf.a'yı silermake re- fclean + all (temiz derleme)
- man printf - Standart printf() belgesi
- Variadic Functions in C - C variadic fonksiyonları
- stdarg.h Documentation - va_list, va_start, va_arg, va_end makroları
- Hexadecimal Number System - 16'lık sayı sistemi
Proje geliştirilirken aşağıdaki konularda AI yardımı kullanılmıştır:
- Variadic fonksiyonların temeleri: ChatGPT ve Gemini ile variadic fonksiyonların nasıl çalıştığı öğrenilmiştir
- Format specifier'lar: printf() fonksiyonunun davranışı ve edge case'ler araştırılmıştır
- Hexadecimal dönüşümleri: 10'luk tabandan 16'lık tabana dönüşüm logic'i anlaşılmıştır
ft_printf() fonksiyonu aşağıdaki adımlarla çalışır:
- Format String İterasyonu: Format string karakterleri sırayla okur
- % Karakterinin Kontrolü:
%bulunduğunda sonraki karakteri kontrol eder - Format Specifier Doğrulama: Sonraki karakter geçerli bir specifier ise işler
- Argüman Okuma:
va_arg()makrosu ile variadic listeden argümanları alır - Dönüştürme ve Yazdırma: Her specifier türüne göre dönüştürme yaparak çıkışa yazar
- Yazılan Karakter Sayısını İzleme: Toplam yazılan karakter sayısını saymak için counter kullanılır
Proje basit bir yapıdadır ve karmaşık veri yapıları kullanmaz:
- va_list: Variadic argümanları saklamak için
- Recursion: Hexadecimal dönüşümü için (ft_print_hex)
- Dynamic Memory: ft_itoa() için malloc/free kullanılır
ft_printf(): Ana fonksiyonft_check_format(): Format specifier'a göre uygun fonksiyonu çağırırft_print_int(): Integer yazdırır (ft_itoa kullanır)ft_print_hex(): Recursive olarak hexadecimal çevirirft_print_ptr(): Pointer'ı hexadecimal formatında yazdırır
C dilinde, fonksiyonlar normal şartlarda sabit sayıda parametre alır. Ancak printf() gibi fonksiyonlar değişken sayıda parametre alabilir. Bu, <stdarg.h> başlık dosyasındaki makrolar sayesinde mümkündür:
void ft_printf(const char *str, ...) // ... = variadic parametreler
{
va_list args;
va_start(args, str); // Argüman listesini başlat
// ... va_arg(args, type) ile argümanları oku
va_end(args); // Temizle
}Proje aşağıdaki edge case'leri doğru şekilde işler:
- NULL string (
%sile NULL gelince → "(null)" yazar) - NULL pointer (
%pile NULL gelince → "(nil)" yazar) - INT_MIN ve INT_MAX değerleri
- UINT_MAX gibi büyük unsigned sayılar
- Empty string
- Null character ('\0')
- Invalid format specifier'lar (hatalı
%zgibi)