Yazan: Şadi Evren ŞEKER
Bir dilde bulunan ve o dilin tanımlı olan alfabesi içerisindeki sembollerin çeşitli sayılarda ve çeşitli sırada dizilmesi ile elde edilen yazılardır.
Örneğin bir dildeki alfabe aşağıdaki şekilde tanımlı olsun:
∑1 = {0,1}
Buna göre dilimizde sadece “0″ ve “1″ sembolleri tanımlı demektir. Bu dilde örneğin w1=0 veya w2=10101011010 gibi bir dizgi elde etmek mümkündür.
Bir dizginin belirli bir kımını içeren dizgiye ise alt dizgi adı verilir. Örneğin w3=1011 dizgisi w2 dizgisinin bir altdizgisidir.
Ayrıca iki dizginin arka arkaya eklenmesine de üleştirme(concatenation) denilir.Örneğin w1 ile w3 dizgilerinin üleştirilmiş hali w4=01011 olur.
C ile dizgi okuma
C dilinde klavyeden dizgi (String) okumak için kullanılan en basit fonksiyon scanf fonksiyonudur. Bu fonksiyonu basit bir uygulamada aşağıdaki şekilde kullanabiliriz:

Yukarıdaki kodda, 5. satırda tanımlalan karakter dizisi (string) içerisine 7. satırda %s parametresi ile scanf fonksiyonu kullanılarak bir dizgi okunmuştur. Bu dizginin içeriği kodun 8. satırında ekrana basılmıştır.
Örneğin yukarıdaki kod aşağıdaki şekilde çalıştırılabilir:

Görüldüğü üzere, kullanıcı isim olarak “ali” girmiş ve ekranda, girdiği bu dizgiyi görmüştür. Ancak aynı kodu çalıştırarak aşağıdaki şekilde bir dizgi girilirse problem yaşanır:

Yukarıdaki girdide “ali baba ve kirk haramiler” şeklinde 5 kelimeden oluşan bir dizgi girilirken, bu dizginin sadece ilk kelimesi scanf tarafından okunmuştur. Aslında burada bir hata yoktur çünkü scanf fonksiyonu, boşluk karakteri veya satır sonu gibi karakterlere kadar olan dizgileri okur. Yukarıdaki gibi birden fazla kelimeden oluşan dizgiler okunmak istendiğinde, aşağıdaki kodda da gösterilen gets fonksiyonu kullanılabilir:

Yukarıdaki kodda bir önceki koda göre sadece 7. satırda bulunan scanf fonksiyonu, gets fonksiyonu ile değiştirilmiştir. Kodumuzun yeni halini çalıştırdığımızda, aşağıdaki şekilde birden fazla kelime okuyabildiğimizi görürüz:

Dizgilerin Eşitliği
İki farklı değişkende bulunan dizginin eşit olup olmadığı, programlama dillerinde bulunan klasik operatörler ile yapılamaz.
Örneğin aşağıdaki kodlama C dili açısından doğru olsa bile mantıksal olarak hatalıdır (logic error):
char a[100] = “bilgisayarkavramlari.com”;
char b[100]= “bilgisayarkavramlari.com”;
if(a==b)
Yukarıdaki kodun, son satırında bulunan eşitlik kontrolü, C dili açısından ne derleme (compile) ne de çalışma (run-time) hatası döndürmez. Ancak buradaki karşılaştırma aslında iki dizinin (array) hafızada (RAM) aynı yeri gösterip göstermediğini sorgulamaktadır.
Yukarıdaki kod, her zaman için yanlış (false) döner ve if kontrolüne hiçbir zaman girilemez. Bunun yerine dizgilerin içeriklerinin karakter karakter kontrol edilmesi ve dizgilerin boyutlarının eşit olup olmadığının sorgulanması gerekir.. Bizim iki dizginin eşitliğinden anladığımız genelde budur. Bu kontrole literatürde derin karşılaştırma (deep compare) ismi verilmektedir.. Klasik olarak yapılan a==b kontrolü ise sığ karşılaştırma (shallow compare) olarak geçmektedir.
Derin karşılaştırma için kendimiz bir fonksiyon yazabileceğimiz gibi, C dilinde var olan string.h kütüphanesindeki strcmp fonksiyonunu kullanabiliriz. Bu fonksiyon iki dizgiyi (string) sözlük sıralamasına göre karşılaştırır (lexiconically) ve şayet eşitlerse 0 değerini döndürür.
C dilinde 0 değeri mantıksal olarak yanlış (false) olduğu için eşit olmaları durumunda bir if bloğunun çalışmasını istiyorsak, aşağıdaki şekilde yazabiliriz:
if(!strcmp(a,b))
yukarıdaki kontrol, a ve b dizgilerinin eşitliği durumunda geçer.
Aynı kontrol JAVA veya C# gibi dillerde, String sınıfının bulunması sayesinde, ilave bir kütüphane ve fonksiyona gerek kalmadan çözülebilir.
Örneğin JAVA dili için:
String a= “www.bilgisayarkavramlari.com”;
String b= “www.bilgisayarkavramlari.com”;
if(a.equals(b))
kontrolü yapılması yeterlidir. Java dilinde, bulunan ve dizgileri karşılaştırmak için kullanılan equals fonksiyonu C# dilinde ilk harfi büyük olarak Equals şeklinde yazılarak çalıştırılabilir (burada bir kere daha JAVA’yı taklit ederken, java kodlarının çalışmaması için özel gayret sarf eden microsoft geliştiricilerini selamlıyoruz.)
Dizgilerin birbirine eklenmesi (concatenate, üleştirme) için C ve C++ gibi dillerde strcat fonksiyonu kullanılabilir.
Örneğin:
char a[100]= “www.”;
char b[100] = “bilgisayarkavramlari.com”;
strcat(a,b);
printf(“%s”,a);
şeklindeki bir kod, ekrana “www.bilgisayarkavramlari.com” sonucunu basacaktır.
Aynı üleştirme işlemi, JAVA veya C# için basit bir toplama (+) işlemi ile yapılabilir.
String a=”www.”;
String b=”bilgisayarkavramlari.com”;
System.out.println(a+b);
yukarıdaki kod, ekrana “www.bilgisayarkavramlari.com” sonucunu basarken aynı kodu C# dilinde sadece son satırını Console.write(a+b) olarak değiştirerek deneyebilirsiniz.
268 views

hocam örnegin scanf(“%s”,isim) yazdıgımda program uzun giris yaptıgımda
sapıtıyor gets(isim) yazdıgımda ise o bolümü atlıyor gets’i nasıl
kullanacagımı gösterirmisiniz?
sorunuza cevap olması açısından yukarıdaki yazının içerisine hem scanf hem de gets kullanan basit birer örnek ekliyorum, farkları zaten bu örnekten anlaşılır.
umarım yardımcı olur
başarılar
hocam ben anadolu bilişim öğrencis,iyim bana kitap önerebilirmsnz