-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
🚀 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! 💻✨
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