- Puan
- 28
- Yaş
- 118
╔════════════════════════════════════════════════════════════════════╗
║ C PROGRAMLAMA DİLİ EĞİTİM SERİSİ #8 ║
║ STRINGLER (KARAKTER DİZİLERİ) ║
║ (Mala Anlatır Gibi) ║
╚════════════════════════════════════════════════════════════════════╝
Önceki bölümde dizileri öğrendik.
Artık:
✓ Birden fazla sayıyı tek isim altında saklayabiliyoruz
✓ Döngülerle yüzlerce veriyi işleyebiliyoruz
✓ Ortalama, toplam ve arama işlemleri yapabiliyoruz
Fakat yeni bir problem ortaya çıktı.
Şimdiye kadar sadece sayılarla çalıştık.
Peki isim nasıl saklayacağız?
Örnek:
Ahmet
Mehmet
Ayşe
Zeynep
Bunlar sayı değil.
Bunlar metin.
İşte burada STRINGLER devreye girer.
════════════════════════════════════════════════════════════════════
▓▓▓ STRING NEDİR?
String:
Karakterlerden oluşan bir dizidir.
Aslında C dilinde özel bir string veri tipi yoktur.
Bu çok önemli bir bilgidir.
Birçok dilde:
string isim = "Ahmet";
yazılır.
Ama C dilinde işler biraz farklıdır.
C dili der ki:
"Metin mi saklayacaksın?
Karakter dizisi kullan."
════════════════════════════════════════════════════════════════════
▓▓▓ CHAR NEDİR?
Hatırlarsanız:
char
tek bir karakter saklıyordu.
Örnek:
char harf = 'A';
Burada sadece:
A
saklanıyor.
Bir tane karakter.
════════════════════════════════════════════════════════════════════
▓▓▓ PEKİ KELİME NASIL SAKLANIYOR?
Örnek:
Ahmet
Bilgisayar bunu şöyle görür:
A
h
m
e
t
Yani:
5 farklı karakter.
Bu yüzden:
char isim[6] = "Ahmet";
şeklinde saklanır.
════════════════════════════════════════════════════════════════════
▓▓▓ NEDEN 6?
En çok sorulan sorulardan biri.
Ahmet
5 harf.
Ama biz:
char isim[6];
yazdık.
Neden?
Çünkü C dili stringlerin sonuna gizli bir karakter koyar.
Bu karakter:
\0
olarak gösterilir.
Buna:
Null Terminator
denir.
Bellekte görünüm:
A
h
m
e
t
\0
Toplam:
6 karakter
════════════════════════════════════════════════════════════════════
▓▓▓ STRING TANIMLAMA
Yöntem 1
char isim[6] = "Ahmet";
Yöntem 2
char isim[] = "Ahmet";
İkinci yöntemde boyutu derleyici otomatik hesaplar.
════════════════════════════════════════════════════════════════════
▓▓▓ STRING YAZDIRMA
#include <stdio.h>
int main()
{
char isim[] = "Ahmet";
printf("%s", isim);
return 0;
}
ÇIKTI
Ahmet
Buradaki:
%s
string yazdırmak için kullanılır.
════════════════════════════════════════════════════════════════════
▓▓▓ KARAKTERLERE TEK TEK ERİŞME
String aslında dizi olduğu için:
char isim[] = "Ahmet";
şöyle görünür:
isim[0] = A
isim[1] = h
isim[2] = m
isim[3] = e
isim[4] = t
isim[5] = \0
Örnek:
printf("%c", isim[0]);
ÇIKTI
A
════════════════════════════════════════════════════════════════════
▓▓▓ TÜM KARAKTERLERİ GEZME
#include <stdio.h>
int main()
{
char isim[] = "Ahmet";
for(int i=0; isim != '\0'; i++)
{
printf("%c\n", isim);
}
return 0;
}
ÇIKTI
A
h
m
e
t
════════════════════════════════════════════════════════════════════
▓▓▓ KULLANICIDAN İSİM ALMA
#include <stdio.h>
int main()
{
char isim[50];
scanf("%s", isim);
printf("%s", isim);
return 0;
}
Giriş:
Ahmet
Çıktı:
Ahmet
════════════════════════════════════════════════════════════════════
▓▓▓ SCANF'IN TEHLİKESİ
Örnek giriş:
Ahmet Yılmaz
scanf("%s", isim);
sadece:
Ahmet
okur.
Boşluk görünce durur.
Bu yeni başlayanların çok düştüğü bir tuzaktır.
════════════════════════════════════════════════════════════════════
▓▓▓ FGETS KULLANIMI
Daha güvenli yöntem:
#include <stdio.h>
int main()
{
char isim[100];
fgets(isim, sizeof(isim), stdin);
printf("%s", isim);
return 0;
}
Artık:
Ahmet Yılmaz
gibi boşluklu veriler alınabilir.
════════════════════════════════════════════════════════════════════
▓▓▓ STRING.H KÜTÜPHANESİ
String işlemleri için:
#include <string.h>
kullanılır.
Bu kütüphane birçok hazır fonksiyon içerir.
════════════════════════════════════════════════════════════════════
▓▓▓ STRLEN()
En çok kullanılan fonksiyonlardan biridir.
Görevi:
String uzunluğunu bulmak.
Örnek:
#include <stdio.h>
#include <string.h>
int main()
{
char isim[] = "Ahmet";
printf("%d", strlen(isim));
return 0;
}
ÇIKTI
5
Çünkü:
Ahmet
5 harften oluşuyor.
════════════════════════════════════════════════════════════════════
▓▓▓ STRCPY()
Bir stringi başka stringe kopyalar.
Örnek:
#include <stdio.h>
#include <string.h>
int main()
{
char kaynak[] = "Cyber3301RD";
char hedef[50];
strcpy(hedef, kaynak);
printf("%s", hedef);
return 0;
}
ÇIKTI
Cyber3301RD
════════════════════════════════════════════════════════════════════
▓▓▓ STRCAT()
Stringleri birleştirir.
Örnek:
#include <stdio.h>
#include <string.h>
int main()
{
char isim[50] = "Cyber";
strcat(isim, "3301RD");
printf("%s", isim);
return 0;
}
ÇIKTI
Cyber3301RD
════════════════════════════════════════════════════════════════════
▓▓▓ STRCMP()
İki stringi karşılaştırır.
Örnek:
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "admin";
char b[] = "admin";
printf("%d", strcmp(a,b));
return 0;
}
ÇIKTI
0
Neden?
Çünkü iki string aynı.
════════════════════════════════════════════════════════════════════
▓▓▓ ŞİFRE KONTROLÜ
#include <stdio.h>
#include <string.h>
int main()
{
char sifre[50];
scanf("%s", sifre);
if(strcmp(sifre,"12345")==0)
{
printf("Giris Basarili");
}
else
{
printf("Hatali Sifre");
}
return 0;
}
════════════════════════════════════════════════════════════════════
▓▓▓ CHAR VE STRING FARKI
char harf = 'A';
Tek karakter.
char isim[] = "Ahmet";
Karakter dizisi.
Dikkat:
'A'
ve
"A"
aynı şey değildir.
Yeni başlayanların klasik hatasıdır.
════════════════════════════════════════════════════════════════════
▓▓▓ ASCII TABLOSU
Bilgisayar harfleri sayı olarak saklar.
Örnek:
A = 65
B = 66
C = 67
a = 97
b = 98
c = 99
Örnek:
printf("%d",'A');
ÇIKTI
65
════════════════════════════════════════════════════════════════════
▓▓▓ BÜYÜK HARFİ KÜÇÜK HARFE ÇEVİRME
#include <stdio.h>
int main()
{
char harf = 'A';
harf = harf + 32;
printf("%c", harf);
return 0;
}
ÇIKTI
a
ASCII sayesinde çalışır.
════════════════════════════════════════════════════════════════════
▓▓▓ MİNİ PROJE #1
İSİM UZUNLUĞU BULMA
#include <stdio.h>
#include <string.h>
int main()
{
char isim[50];
scanf("%s", isim);
printf("%d", strlen(isim));
return 0;
}
════════════════════════════════════════════════════════════════════
▓▓▓ MİNİ PROJE #2
KULLANICI ADI KONTROLÜ
#include <stdio.h>
#include <string.h>
int main()
{
char kullanici[50];
scanf("%s", kullanici);
if(strcmp(kullanici,"admin")==0)
{
printf("Hosgeldin Admin");
}
else
{
printf("Yetkisiz Kullanici");
}
return 0;
}
════════════════════════════════════════════════════════════════════
▓▓▓ MİNİ PROJE #3
AD SOYAD BİRLEŞTİRME
#include <stdio.h>
#include <string.h>
int main()
{
char ad[50] = "Ahmet";
char soyad[] = " Yilmaz";
strcat(ad, soyad);
printf("%s", ad);
return 0;
}
ÇIKTI
Ahmet Yilmaz
════════════════════════════════════════════════════════════════════
⚠ YENİ BAŞLAYANLARIN HATALARI
HATA #1
char isim = "Ahmet";
YANLIŞ
Doğrusu:
char isim[] = "Ahmet";
════════════════════════════════════════════════════════════════════
HATA #2
if(a == b)
String karşılaştırırken kullanmak.
Doğrusu:
strcmp(a,b)
════════════════════════════════════════════════════════════════════
HATA #3
scanf("%s")
ile boşluklu veri almaya çalışmak.
Boşluk görünce okumayı durdurur.
════════════════════════════════════════════════════════════════════
✓ BÖLÜM ÖZETİ
Bu bölümde:
✓ String nedir
✓ Karakter dizileri
✓ Null terminator
✓ %s kullanımı
✓ scanf ve fgets
✓ strlen()
✓ strcpy()
✓ strcat()
✓ strcmp()
✓ ASCII mantığı
✓ Şifre kontrolü
✓ String işlemleri
konularını öğrendik.
Bir sonraki bölümde POINTERLAR (İşaretçiler) konusuna geçeceğiz. Bu konu C dilinin en güçlü ve en korkulan bölümlerinden biridir.
║ C PROGRAMLAMA DİLİ EĞİTİM SERİSİ #8 ║
║ STRINGLER (KARAKTER DİZİLERİ) ║
║ (Mala Anlatır Gibi) ║
╚════════════════════════════════════════════════════════════════════╝
Önceki bölümde dizileri öğrendik.
Artık:
✓ Birden fazla sayıyı tek isim altında saklayabiliyoruz
✓ Döngülerle yüzlerce veriyi işleyebiliyoruz
✓ Ortalama, toplam ve arama işlemleri yapabiliyoruz
Fakat yeni bir problem ortaya çıktı.
Şimdiye kadar sadece sayılarla çalıştık.
Peki isim nasıl saklayacağız?
Örnek:
Ahmet
Mehmet
Ayşe
Zeynep
Bunlar sayı değil.
Bunlar metin.
İşte burada STRINGLER devreye girer.
════════════════════════════════════════════════════════════════════
▓▓▓ STRING NEDİR?
String:
Karakterlerden oluşan bir dizidir.
Aslında C dilinde özel bir string veri tipi yoktur.
Bu çok önemli bir bilgidir.
Birçok dilde:
string isim = "Ahmet";
yazılır.
Ama C dilinde işler biraz farklıdır.
C dili der ki:
"Metin mi saklayacaksın?
Karakter dizisi kullan."
════════════════════════════════════════════════════════════════════
▓▓▓ CHAR NEDİR?
Hatırlarsanız:
char
tek bir karakter saklıyordu.
Örnek:
char harf = 'A';
Burada sadece:
A
saklanıyor.
Bir tane karakter.
════════════════════════════════════════════════════════════════════
▓▓▓ PEKİ KELİME NASIL SAKLANIYOR?
Örnek:
Ahmet
Bilgisayar bunu şöyle görür:
A
h
m
e
t
Yani:
5 farklı karakter.
Bu yüzden:
char isim[6] = "Ahmet";
şeklinde saklanır.
════════════════════════════════════════════════════════════════════
▓▓▓ NEDEN 6?
En çok sorulan sorulardan biri.
Ahmet
5 harf.
Ama biz:
char isim[6];
yazdık.
Neden?
Çünkü C dili stringlerin sonuna gizli bir karakter koyar.
Bu karakter:
\0
olarak gösterilir.
Buna:
Null Terminator
denir.
Bellekte görünüm:
A
h
m
e
t
\0
Toplam:
6 karakter
════════════════════════════════════════════════════════════════════
▓▓▓ STRING TANIMLAMA
Yöntem 1
char isim[6] = "Ahmet";
Yöntem 2
char isim[] = "Ahmet";
İkinci yöntemde boyutu derleyici otomatik hesaplar.
════════════════════════════════════════════════════════════════════
▓▓▓ STRING YAZDIRMA
#include <stdio.h>
int main()
{
char isim[] = "Ahmet";
printf("%s", isim);
return 0;
}
ÇIKTI
Ahmet
Buradaki:
%s
string yazdırmak için kullanılır.
════════════════════════════════════════════════════════════════════
▓▓▓ KARAKTERLERE TEK TEK ERİŞME
String aslında dizi olduğu için:
char isim[] = "Ahmet";
şöyle görünür:
isim[0] = A
isim[1] = h
isim[2] = m
isim[3] = e
isim[4] = t
isim[5] = \0
Örnek:
printf("%c", isim[0]);
ÇIKTI
A
════════════════════════════════════════════════════════════════════
▓▓▓ TÜM KARAKTERLERİ GEZME
#include <stdio.h>
int main()
{
char isim[] = "Ahmet";
for(int i=0; isim != '\0'; i++)
{
printf("%c\n", isim);
}
return 0;
}
ÇIKTI
A
h
m
e
t
════════════════════════════════════════════════════════════════════
▓▓▓ KULLANICIDAN İSİM ALMA
#include <stdio.h>
int main()
{
char isim[50];
scanf("%s", isim);
printf("%s", isim);
return 0;
}
Giriş:
Ahmet
Çıktı:
Ahmet
════════════════════════════════════════════════════════════════════
▓▓▓ SCANF'IN TEHLİKESİ
Örnek giriş:
Ahmet Yılmaz
scanf("%s", isim);
sadece:
Ahmet
okur.
Boşluk görünce durur.
Bu yeni başlayanların çok düştüğü bir tuzaktır.
════════════════════════════════════════════════════════════════════
▓▓▓ FGETS KULLANIMI
Daha güvenli yöntem:
#include <stdio.h>
int main()
{
char isim[100];
fgets(isim, sizeof(isim), stdin);
printf("%s", isim);
return 0;
}
Artık:
Ahmet Yılmaz
gibi boşluklu veriler alınabilir.
════════════════════════════════════════════════════════════════════
▓▓▓ STRING.H KÜTÜPHANESİ
String işlemleri için:
#include <string.h>
kullanılır.
Bu kütüphane birçok hazır fonksiyon içerir.
════════════════════════════════════════════════════════════════════
▓▓▓ STRLEN()
En çok kullanılan fonksiyonlardan biridir.
Görevi:
String uzunluğunu bulmak.
Örnek:
#include <stdio.h>
#include <string.h>
int main()
{
char isim[] = "Ahmet";
printf("%d", strlen(isim));
return 0;
}
ÇIKTI
5
Çünkü:
Ahmet
5 harften oluşuyor.
════════════════════════════════════════════════════════════════════
▓▓▓ STRCPY()
Bir stringi başka stringe kopyalar.
Örnek:
#include <stdio.h>
#include <string.h>
int main()
{
char kaynak[] = "Cyber3301RD";
char hedef[50];
strcpy(hedef, kaynak);
printf("%s", hedef);
return 0;
}
ÇIKTI
Cyber3301RD
════════════════════════════════════════════════════════════════════
▓▓▓ STRCAT()
Stringleri birleştirir.
Örnek:
#include <stdio.h>
#include <string.h>
int main()
{
char isim[50] = "Cyber";
strcat(isim, "3301RD");
printf("%s", isim);
return 0;
}
ÇIKTI
Cyber3301RD
════════════════════════════════════════════════════════════════════
▓▓▓ STRCMP()
İki stringi karşılaştırır.
Örnek:
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "admin";
char b[] = "admin";
printf("%d", strcmp(a,b));
return 0;
}
ÇIKTI
0
Neden?
Çünkü iki string aynı.
════════════════════════════════════════════════════════════════════
▓▓▓ ŞİFRE KONTROLÜ
#include <stdio.h>
#include <string.h>
int main()
{
char sifre[50];
scanf("%s", sifre);
if(strcmp(sifre,"12345")==0)
{
printf("Giris Basarili");
}
else
{
printf("Hatali Sifre");
}
return 0;
}
════════════════════════════════════════════════════════════════════
▓▓▓ CHAR VE STRING FARKI
char harf = 'A';
Tek karakter.
char isim[] = "Ahmet";
Karakter dizisi.
Dikkat:
'A'
ve
"A"
aynı şey değildir.
Yeni başlayanların klasik hatasıdır.
════════════════════════════════════════════════════════════════════
▓▓▓ ASCII TABLOSU
Bilgisayar harfleri sayı olarak saklar.
Örnek:
A = 65
B = 66
C = 67
a = 97
b = 98
c = 99
Örnek:
printf("%d",'A');
ÇIKTI
65
════════════════════════════════════════════════════════════════════
▓▓▓ BÜYÜK HARFİ KÜÇÜK HARFE ÇEVİRME
#include <stdio.h>
int main()
{
char harf = 'A';
harf = harf + 32;
printf("%c", harf);
return 0;
}
ÇIKTI
a
ASCII sayesinde çalışır.
════════════════════════════════════════════════════════════════════
▓▓▓ MİNİ PROJE #1
İSİM UZUNLUĞU BULMA
#include <stdio.h>
#include <string.h>
int main()
{
char isim[50];
scanf("%s", isim);
printf("%d", strlen(isim));
return 0;
}
════════════════════════════════════════════════════════════════════
▓▓▓ MİNİ PROJE #2
KULLANICI ADI KONTROLÜ
#include <stdio.h>
#include <string.h>
int main()
{
char kullanici[50];
scanf("%s", kullanici);
if(strcmp(kullanici,"admin")==0)
{
printf("Hosgeldin Admin");
}
else
{
printf("Yetkisiz Kullanici");
}
return 0;
}
════════════════════════════════════════════════════════════════════
▓▓▓ MİNİ PROJE #3
AD SOYAD BİRLEŞTİRME
#include <stdio.h>
#include <string.h>
int main()
{
char ad[50] = "Ahmet";
char soyad[] = " Yilmaz";
strcat(ad, soyad);
printf("%s", ad);
return 0;
}
ÇIKTI
Ahmet Yilmaz
════════════════════════════════════════════════════════════════════
⚠ YENİ BAŞLAYANLARIN HATALARI
HATA #1
char isim = "Ahmet";
YANLIŞ
Doğrusu:
char isim[] = "Ahmet";
════════════════════════════════════════════════════════════════════
HATA #2
if(a == b)
String karşılaştırırken kullanmak.
Doğrusu:
strcmp(a,b)
════════════════════════════════════════════════════════════════════
HATA #3
scanf("%s")
ile boşluklu veri almaya çalışmak.
Boşluk görünce okumayı durdurur.
════════════════════════════════════════════════════════════════════
✓ BÖLÜM ÖZETİ
Bu bölümde:
✓ String nedir
✓ Karakter dizileri
✓ Null terminator
✓ %s kullanımı
✓ scanf ve fgets
✓ strlen()
✓ strcpy()
✓ strcat()
✓ strcmp()
✓ ASCII mantığı
✓ Şifre kontrolü
✓ String işlemleri
konularını öğrendik.
Bir sonraki bölümde POINTERLAR (İşaretçiler) konusuna geçeceğiz. Bu konu C dilinin en güçlü ve en korkulan bölümlerinden biridir.