Skip to content
EminOzXPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

Repository files navigation

This project has been created as part of the 42 curriculum by muhamoz

ft_printf

Description

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

Instructions

Derleme

Projeyi derlemek için:

make

Bu komut libftprintf.a statik kütüphanesini oluşturur.

Kullanım

#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
./program

Make Kuralları

  • make all - Kütüphaneyi derler
  • make clean - .o dosyalarını siler
  • make fclean - .o dosyalarını ve libftprintf.a'yı siler
  • make re - fclean + all (temiz derleme)

Resources

Referanslar

AI Kullanımı

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

Teknik Detaylar

Algoritma ve Veri Yapısı

Format String Parsing

ft_printf() fonksiyonu aşağıdaki adımlarla çalışır:

  1. Format String İterasyonu: Format string karakterleri sırayla okur
  2. % Karakterinin Kontrolü: % bulunduğunda sonraki karakteri kontrol eder
  3. Format Specifier Doğrulama: Sonraki karakter geçerli bir specifier ise işler
  4. Argüman Okuma: va_arg() makrosu ile variadic listeden argümanları alır
  5. Dönüştürme ve Yazdırma: Her specifier türüne göre dönüştürme yaparak çıkışa yazar
  6. Yazılan Karakter Sayısını İzleme: Toplam yazılan karakter sayısını saymak için counter kullanılır

Veri Yapısı

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

Önemli Fonksiyonlar

  • ft_printf(): Ana fonksiyon
  • ft_check_format(): Format specifier'a göre uygun fonksiyonu çağırır
  • ft_print_int(): Integer yazdırır (ft_itoa kullanır)
  • ft_print_hex(): Recursive olarak hexadecimal çevirir
  • ft_print_ptr(): Pointer'ı hexadecimal formatında yazdırır

Variadic Fonksiyonlar Nedir?

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
}

Edge Case'ler

Proje aşağıdaki edge case'leri doğru şekilde işler:

  • NULL string (%s ile NULL gelince → "(null)" yazar)
  • NULL pointer (%p ile 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ı %z gibi)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages