Bu kısım, C yazılımcılığına yeni başlayanlar için dizge kavramlarının kısa bir özetini barındırır. Karakter dizgelerinin C'de nasıl temsil edildiği ve bilinen bazı tuzaklar hakkında bilgi verilecektir. Bu bilgilere zaten sahipseniz bu bölümü atlayabilirsiniz.
Bir
dizge,
char türünden nesnelerden oluşan bir dizidir. Fakat dizge değerli değişkenler genellikle
char * türünden bir gösterici olarak bildirilirler. Bu tür değişkenler dizgenin metni için alan içermezler. Dizge bir dizi değişkeninde, bir dizge sabitinde ya da
özdevimli ayrılmış bir bellek bölgesinde olabilir. Gösterici değişkeninde seçilen bellek bölgesinin adresini saklarsınız. Ayrıca gösterici değişkeninde bir boş gösterici de saklayabilirsiniz. Boş gösterici hiçbir yeri göstermediğinden onu bir dizge olarak gösterirseniz bir hata alırsınız.
Bir dizge normalde geniş karakterli dizgenin tersine bir çokbaytlı karakter dizisidir. Geniş karakterli dizgeler
wchar_t türünden dizilerdir ve çok baytlı karakter dizileri gibi genellikle
wchar_t * türünden göstericilerle kullanılırlar.
Teamülen, bir
boş karakter,
'\0' karakteridir ve bir çokbaytlı karakter dizisinin sonuna konur,
boş geniş karakter ise
L'\0' karakteridir ve bir geniş karakterli dizgenin sonuna konur. Örneğin,
char * türünden
p değişkeninin gösterdiği dizgenin sonunda bir boş karakter olup olmadığını
!*p veya
*p == '\0' yazarak sınayabilirsiniz.
Bir boş karakter ile bir boş gösterici arasında sadece kavramsal fark vardır, her ikisi de 0 tamsayısı tarafından temsil edilir.
Dizge sabitler C yazılımlarında çift tırnak içine alınmış karakterlerin büyük harf L ile öncelenmesi ile oluşurlar,
L"foo" gibi. ISO C'de dizge sabitler kendiliğinden
birleşik dizge oluştururlar, örneğin
"a" "b" ile
"ab" aynıdır. Geniş karakterli dizgeler için bu gösterimler
L"a" L"b" veya
L"a" "b" biçiminde olabilir. GNU C derleyicisi dizge sabitler üzerinde değişiklik yapılmasına izin vermez, çünkü sabitler salt-okunur bölgede tutulurlar.
Ayrıca const ile bildirilen karakter dizileri de değiştirilemezler. C derleyicisi const char * türünden bir değişiklik yapılamayan bir dizge göstericisi kullanıldığında istemdışı değişiklikleri saptayabildiğinden en iyisi dizge sabitleri const char * türünde bildirmektir.
Karakter dizisi için ayrılan belleğin miktarı dizgenin sonunu belirleyen boş karaktere kadar uzayabilir. Bu belgede
ayrılan boyut denilince daima dizge için ayrılan belleğin toplam miktarından,
uzunluk denilince dizgeyi sonlandıran boş karakter hariç dizgedeki toplam karakter sayısından bahsetmiş olacağız.
Namlı yazılım hatalarından biri bir dizgeye ayrılan yere sığacağından daha fazla karakter girilmeye çalışılmasıdır. Kodu yazarken, önceden ayrılmış bir dizi içine dizge veya karakterler taşınırken metnin uzunluğunu sürekli denetlemeli dizinin taşmamasına dikkat etmelisiniz. Bir çok kütüphane işlevi bu işlemi sizin yerinize yapmaz. Dizgenin sonunu belirtecek olan boş karakter için de yer ayırmayı unutmayın.
Genellikle, dizgeler, her baytı bir karakteri ifade eden bayt dizileridir. Bu özellik eğer dizge tek baytlık karakter kodlaması ile yazılmışsa geçerlidir. Eğer çok baytlı karakter kodlaması kullanılmışsa bu değişir. (Karakter kodlamaları için
Genişletilmiş Karakterlere Giriş bölümüne bakınız.) Yazılım geliştirme arayüzü bakımından bu iki dizge çeşidi bir fark oluşturmaz; yeterki yazılımcı bu farka dikkat ederek dizgeleri uygun yorumlasın.
Ancak arayüz için bir farklılık oluşturmayan bayt temelli işlevlerin kullanımı kimi zaman zor olur. Bu işlevlerin baytları belirleyen sayaç parametreleri strncpy işlevini çağırarak bir çokbaytlı karakteri ortasından bölüp bir eksik (dolayısıyla kullanışsız) bayt dizisi olarak hedef tampona yerleştirir.
Bu sorunlardan kurtulmak için ISO C standardının daha sonraki sürümlerinde
geniş karakterler (
Genişletilmiş Karakterlere Giriş) ile çalışan ikinci bir işlev kümesi tanımlandı. Her geniş karakter kurallara uygun ve yorumlanabilir olduğundan bu işlevlerle tek baytlık karakter dizileriyle çalışmada karşılaşılan sorunlar ortadan kalktı. Bu geniş karakterli dizgelerde kesme işleminin uygunsuz bir yerden yapılmayacağı anlamına gelmez. Normalde alfabe temelli diller (normalleştirilmemiş metinler hariç) için sorun yoktur, ancak hece temelli dillerde (Çince gibi) mantıksal birimleri çok sayıda geniş karakter oluşturduğundan bu sorun hala devam etmektedir. Bu kadarı bile yine de iyidir, çünkü en azından geçersiz bayt dizileri oluşmamaktadır. Ayrıca, daha yüksek seviyeli işlevler geniş karakterli dizgelerle çok baytlı karakter dizilerinden daha kolay çalışır. Bu bakımdan geniş karakterli dizgelerin kullanılması tercih edilmelidir.
Bu kısmın kalanında geniş karakterli dizgelerle çalışan işlevlere paralal olarak çokbaytlı karakter dizilerini de tartışacağız, çünkü onlar arasında hemen hemen bir tam eşdeğer kullanılabilirlik vardır.