🚀 BAŞTAN SONA C DİLİ BÖLÜM-7: Diziler (Arrays) ve Karakter Dizileri (Strings) 🧵

Konu Özeti

C dilinde diziler ve karakter dizileri (strings) konusu ele alınıyor. Tek ve çok boyutlu dizilerin tanımlanması, indeksleme ve bellek yapısı açıklanıyor. C'de string'lerin null karakterle sonlandırılan char dizileri olduğu vurgulanıyor. Güvenli girdi okuma için fgets() kullanımı ve string.h kütüphanesindeki strlen, strcpy, strcat, strcmp gibi temel fonksiyonlar örneklerle gösteriliyor.

🚀 BAŞTAN SONA C DİLİ BÖLÜM-7: Diziler (Arrays) ve Karakter Dizileri (Strings) 🧵

Selamlar! Serimizin 7. bölümüne hoş geldiniz.

Önceki bölümde C dilinin en kritik konusu olan Pointers (İşaretçiler) yapısını, `&` ve `*` operatörlerini, NULL Pointer mantığını ve Pointer aritmetiğini öğrenmiştik. Bu bölümde ise tek ve çok boyutlu **Dizileri (Arrays)**, C dilinde metin temsilinin tek yolu olan **Karakter Dizilerini (Strings)** ve `<string.h>` kütüphane fonksiyonlarını inceleyeceğiz.

---

📌 1. Tek Boyutlu Diziler (Arrays) 🧱

Dizi, aynı veri tipindeki birden fazla değişkeni bellekte **ardışık (contiguous)** hücrelerde saklayan sabit boyutlu bir yapıdır.

### Özellikler:
• Elemanlara 0’dan başlayan **indeks (index)** ile erişilir.
• Boyutu tanımlanırken belirlenir ve derleme sonrasında boyutu doğrudan büyütülemez.
• Dizi adı, ilk elemanın bellek adresini (`&dizi[0]`) tutan sabit bir pointer'dır.

#include <stdio.h>

int main() {
// 5 elemanlı int ***** tanımlama ve ilk değer atama
int notlar[5] = {85, 90, 70, 100, 60};

printf("3. Not (notlar[2]): %d\n", notlar[2]);

// Dizi elemanlarını döngü ile okuma ve toplama
int toplam = 0;
for (int i = 0; i < 5; i++) {
toplam += notlar;
}

printf("Ortalama: %.2f\n", (float)toplam / 5);

return 0;
}

---

📐 2. Çok Boyutlu Diziler ve Matrisler 🗺️

Tablo veya matris verilerini saklamak için iki boyutlu diziler `dizi[Satir][Sutun]` kullanılır.

#include <stdio.h>

int main() {
// 2 Satır, 3 Sütunlu Matris
int matris[2][3] = {
{10, 20, 30},
{40, 50, 60}
};

printf("--- 2x3 Matris Yazdirma ---\n");
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d\t", matris[j]);
}
printf("\n");
}

return 0;
}

---

🔤 3. C Dilinde Metinler: Karakter Dizileri (Strings) 📜

C dilinde diğer yüksek seviyeli dillerdeki gibi yerleşik bir `String` türü yoktur. Metinler, sonu görünmez bir **Null Karakter (`'\0'`)** ile biten `char` dizileridir.

`'\0'` (Null Terminator), C derleyicisine metnin nerede bittiğini bildirir. Bu yüzden $N$ karakterlik bir metin saklamak için en az $N+1$ boyutlu dizi açılmalıdır!

#include <stdio.h>

int main() {
// Manuel 'Null Terminator' eklemeli tanım:
char isim1[] = {'A', 'h', 'm', 'e', 't', '\0'};

// Çift tırnaklı tanım (Derleyici '\0' karakterini otomatik ekler):
char isim2[] = "Mehmet";

printf("Isim 1: %s\n", isim1);
printf("Isim 2: %s\n", isim2);

return 0;
}

---

📥 4. Metin Okuma: `gets()` Tehlikesi ve `fgets()` Kullanımı ⚠️

Kullanıcıdan boşluk içeren bir metin (Örn: Ad Soyad) okurken `scanf("%s", ...)` kullanılırsa ilk boşlukta okumayı keser.

⚠️ **`gets()` TEHLİKESİ:** `gets()` fonksiyonu girdi sınırını denetlemediği için bellek taşması (Buffer Overflow) güvenlik zafiyetine yol açar. Güncel C standartlarında tamamen **YASAKLANMIŞTIR!**

✅ **ÇÖZÜM:** Her zaman güvenli olan **`fgets()`** fonksiyonu kullanılmalıdır!

#include <stdio.h>

int main() {
char adSoyad[50];

printf("Adinizi ve Soyadinizi Giriniz: ");
// fgets(dizi, maksimum_boyut, girdi_kaynagi)
fgets(adSoyad, sizeof(adSoyad), stdin);

printf("Hoş Geldin, %s", adSoyad);

return 0;
}

---

🛠️ 5. `<string.h>` Kütüphanesi ve Sık Kullanılan Fonksiyonlar 🧰

String işlemleri için `#include <string.h>` başlık dosyası eklenmelidir.

### A. `strlen(str)`
Metnin uzunluğunu (`'\0'` hariç karakter sayısını) döner.

### B. `strcpy(hedef, kaynak)`
Kaynak metni hedef diziye kopyalar.

### C. `strcat(hedef, kaynak)`
Kaynak metni hedef metnin sonuna ekler (birleştirir).

### D. `strcmp(str1, str2)`
İki metni alfabetik/ASCII olarak karşılaştırır.
• Metinler eşitse `0` döner.
• `str1` önce geliyorsa negatif, sonra geliyorsa pozitif değer döner.

#include <stdio.h>
#include <string.h>

int main() {
char str1[30] = "Baştan Sona ";
char str2[] = "C Dili";
char kopya[30];

// 1. Metin Uzunluğu
printf("str2 Uzunlugu: %lu\n", strlen(str2));

// 2. Metin Kopyalama
strcpy(kopya, str2);
printf("Kopyalanan Metin: %s\n", kopya);

// 3. Metin Birleştirme
strcat(str1, str2);
printf("Birlestirilmis Metin: %s\n", str1);

// 4. Metin Karşılaştırma
if (strcmp(kopya, str2) == 0) {
printf("Metinler birebir esittir.\n");
}

return 0;
}

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Tek ve Çok Boyutlu Dizileri, C'de String mantığını (`'\0'`), `fgets()` ile güvenli metin okumayı ve `<string.h>` kütüphanesi fonksiyonlarını öğrendik.

👉 **Bölüm 8'de Bizi Ne Bekliyor?**
• Dynamic Memory Allocation (Dinamik Bellek Yönetimi) 🧠
• Heap vs Stack Bellek Alanları
• **`malloc()`** ve **`free()`** Kullanımı
• **`calloc()`** ile Sıfırlanmış Alan Tahsisi
• **`realloc()`**
ile Bellek Boyutunu Yeniden Boyutlandırma
• Memory Leak (Bellek Sızıntısı) Önleme

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! 💻✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,050Konular
3,297,712Mesajlar
326,237Kullanıcılar
thekral21Son Üye
Üst Alt