C Piscine
/recap/

// hap bilgi · şu ana kadar ne öğrendik

İlerleme: C00 ✓ C01 ✓ C02 ✓ C03
00

Temeller

// fundamentals
Bir fonksiyonun anatomisi
void ft_putchar(char c)
{
    write(1, &c, 1);
}
  • void → dönüş tipi (hiçbir şey döndürmez)
  • ft_putchar → fonksiyon adı
  • (char c) → parametre listesi
  • { ... } → fonksiyon gövdesi
  • ; → her ifadenin sonuna nokta gibi
write fonksiyonu — 3 parametre

write(fd, buf, count)

  • fd → kanal numarası · 1 = ekran
  • buf → verinin adresi (değer değil!)
  • count → kaç byte yazılacak
// altın kural
"C'de string yok. String aslında karakter dizisi.
Dizinin adı zaten ilk elemanın adresidir."
C00

Çıktı & Döngüler

// 9 exercise
Anahtar fikirler
  • Karakter aslında sayıdır (ASCII)
  • 'a'=97, '0'=48
  • while ile döngü
  • if/else ile karar
  • c++ bir sonraki karaktere
  • Sayı→karakter: n + '0'
Tek tırnak vs çift tırnak
'a'  // tek karakter (1 byte)
"a"  // string ('a' + '\0' = 2 byte)

İkisi aynı şey değil. Karıştırma.

İç içe döngü (kombinasyonlar)
while (a <= '7')
{
    b = a + 1;            // b hep a'dan büyük
    while (b <= '8')
    {
        c = b + 1;        // c hep b'den büyük
        ...
    }
}
ft_putnbr → Recursion

423 yazdırmak için: önce 42'yi yazdır (recursive çağrı), sonra son rakam (3).

if (nb >= 10)
    ft_putnbr(nb / 10);
c = (nb % 10) + '0';
write(1, &c, 1);

Tuzak: -2147483648 negatife çevrilemez (overflow). Özel durum yaz.

C01

Pointer'lar

// 9 exercise
Bellek modeli
int x = 42;        int *p = &x;

┌─────────┐        ┌─────────┐
│  x      │        │   p     │
│  0x1000 │ <───── │  0x2000 │
│  [42]   │        │ [0x1000]│
└─────────┘        └─────────┘
                   p, x'i "gösterir"
İki kritik operatör
SembolAnlamıÖrnek
&Adresi nerede?&x = x'in adresi
*İçinde ne var?*p = p'nin gösterdiği değer

*&x = x · birbirinin tersi

⚠️ Yıldızın iki yüzü
int *p = &x;     // TANIM: pointer tipi
*p = 5;          // KULLANIM: dereferans

Aynı sembol, farklı anlam. Bağlama bak.

Pointer neden var?
// Değer geçince — DIŞARIYI ETKİLEMEZ
void f(int n) { n = 42; }

// Adres geçince — DIŞARIDAKİNİ DEĞİŞTİRİR
void f(int *n) { *n = 42; }

Bir fonksiyon iki değer döndüremez ama pointer'la ikisini de değiştirebilir (ft_div_mod).

String = char dizisi = pointer
char *str = "hello";
str[0] == *str       // 'h'
str[i] == *(str + i) // aynı şey

Stringin sonu: '\0' (null terminator)

// pointer üç kuralı
1. Dışarıdaki değer değişsin → adres geçir
2. Pointer'a adres ata: int *p = &x
3. Değere ulaş: *p = 5
+

main argümanları

// bonus
int main(int argc, char **argv)
  • argc → argüman sayısı (program adı dahil)
  • argv[0] → programın kendi adı
  • argv[1..] → gerçek argümanlar
  • argv[argc] → NULL

Tüm argümanlar string olarak gelir. "42"42.

Tip çözümü
argv         → char **    // string dizisi
argv[i]      → char *     // i. string
argv[i][j]   → char       // i.string j.harf
C02

String Manipülasyonu

// 13 exercise · eşik %50
3 ailenin özeti
AileFonksiyonlarİş
Kopyastrcpy, strncpy, strlcpysrc → dest
Kontrolstr_is_alpha/numeric/
lowercase/uppercase/printable
0 / 1 döndürür
Dönüştürstrupcase, strlowcase,
strcapitalize
str'yi değiştir
strcpy iskeleti
i = 0;
while (src[i] != '\0')
{
    dest[i] = src[i];
    i++;
}
dest[i] = '\0';  // elle ekle!
return (dest);
is_alpha iskeleti
while (str[i] != '\0')
{
    if (!harf(str[i]))
        return (0);  // erken çıkış
    i++;
}
return (1);  // boş str → 1
ASCII şifreleri
KontrolAralık
Büyük harf'A' (65) — 'Z' (90)
Küçük harf'a' (97) — 'z' (122)
Rakam'0' (48) — '9' (57)
Yazdırılabilir32 — 126
Büyük↔küçükfark = 32
Hex dönüşümü (ex11, ex12)
char hex[] = "0123456789abcdef";
putchar(hex[c / 16]);  // yüksek nibble
putchar(hex[c % 16]);  // düşük nibble

Cast: (unsigned char)c · işaret sorunu olmasın diye.

!

Kırmızı bayraklar

// dikkat
  • Forbidden function kullanırsan → -42
  • Kod derlenmezse → 0
  • Norminette geçmezse → değerlendirilmez
  • strcpy sonrası '\0' eklemeyi unutma
  • Negatif sayıyı pozitife çevirirken INT_MIN tuzağı
  • str NULL gelebilir, kontrol et (gerektiğinde)
  • Pointer'ı kullanmadan önce bir yere bağla
  • Kolaydan zora — atlamadan ilerle (kolay yapılmazsa zoru sayılmaz)

Sırada

// next up
C03 — String karşılaştırma & birleştirme
  • strcmp / strncmp → iki string'i karşılaştır
  • strcat / strncat / strlcat → iki string'i birleştir
  • strstr → bir string içinde altstring ara

Sadece 6 egzersiz — C02'nin direkt devamı, kısa modül.