Temel C Programlama -41- string.h Başlık Dosyası ile Karakter Dizisi İşlemleri
Daha öncesinde size ctype.h başlık dosyasını anlatmış fakat karakter dizileri için stdio.h, stdlib.h ve string.h başlık dosyalarının da kullanıldığını söylemiştik. Şimdiden belirtelim ki bütün fonksiyonlar için örnek uygulama vermeyeceğim. Sadece önemli gördüklerim hakkında uygulama göstereceğim ve geri kalanı denemek üzere size bırakacağım. Bu kütüphane fonksiyonları dilin teferruatı olduğu için uzun uzadıya anlatmaya gerek yoktur. Çünkü programcılıkta karşınıza belki yüzlerce kütüphane dosyası ve binlerce fonksiyon çıkacaktır. Karşınıza çıkabilecek bütün fonksiyonları anlatan bir eğitim veya öğretecek bir öğretmen bulma imkanınız yoktur. Dilin temelini bir eğitim ile alsanız dahi karşınıza çıkacak kütüphanelerin fonksiyonlarını kullanmayı sürekli öğrenmeniz gerekecektir. Ben de bunu göz önünde bulundurarak dilin temelini uzun uzadıya anlatsam da ayrıntısı olan bu tarz fonksiyonları yorulmamak adına kısa kesiyorum. Bu asla bilgimi sakladığım anlamına gelmesin.
string.h dosyası
Karakter dizisi kütüphanesi (<string.h>) karakter dizileriyle alakalı pek çok kullanışlı fonksiyonu bünyesinde bulundurur. Bunlardan başlıcaları karakter dizisi kopyalama, karakter dizisi birleştirme, karakter dizilerini karşılaştırma gibi fonksiyonlardır. Daha önce söylediğimiz gibi C dilinde karakter dizileri üzerinde operatörler ile işlem yapamadığımız için bu tarz fonksiyonlar vasıtasıyla bu işlemleri yapmaktayız. Şimdi string.h kütüphanesinin fonksiyonlarının ne işe yaradığını baştan sona verelim ve sonrasında örneklere geçelim.
Fonksiyon Adı
İşlev
memcpy
Bir hafıza blokunu kopyalar.
memmove
Bir hafıza blokunu taşır.
strcpy
Bir karakter dizisini kopyalar.
srncpy
Karakter dizisindeki karakterleri kopyalar.
strcat
Karakter dizilerini birleştirir
strncat
Karkater dizisindeki karakterleri birleştirir.
memcmp
İki hafıza blokunu karşılaştırır
strcmp
İki karakter dizisini karşılaştırır.
strcoll
İki karakter dizisini C yerelini kullanarak karşılaştırır. (locale)
strncmp
İki karakter dizisinin karakterlerini karşılaştırır.
strxfrm
C yereli kullanılarak (locale) karakter dizisi dönüştürülür.
memchr
Bir hafıza blokundaki bir karakter tespit edilir.
strchr
Karakter dizisindeki belirtilen karakterin ilk konumu tespit edilir.
strcspn
Karakter dizisinde belli bir karakter aranır ve ilk konumu tespit edilir.
strpbrk
Karakter dizisi içindeki karakterler tespit edilir.
strrchr
Karakter dizisindeki belli bir karakterin en son yer aldığı konum tespit edilir.
strspn
Karakter dizisinde belli bir karakter dizisi aranır ve ilk konumu tespit edilir.
strstr
Karakter dizisi içinde alt karakter dizisi aranır.
strtok
Bir karakter dizisi parçalara bölünür.
memsek
Bir hafıza blokunu doldurur.
strerror
Hata mesajını içeren karakter dizisinin işaretçisi tespit edilir.
strlen
Karakter dizisi uzunluğu tespit edilir
NULL (makro)
BOŞ İŞARETÇİ
size_t (TİP)
sizeof operatörünün döndürdüğü değer tipi
Bir karakter dizisinin uzunluğunu bulma
Elimizde bir karakter dizisi var fakat bunun uzunluğunu bilmiyoruz. Uzunluğu dizinin kaç karakter içerdiği demektir ve bazen bunu öğrenmemiz önemli olabilir. Bunun için bir algoritma kurar ve dizi işaretçisinden (sıfırıncı eleman) itibaren bitirme karakterini (‘\0’) bulana kadar saydırabiliriz. Fakat daha kolayı strlen() fonksiyonunu kullanmaktır. Bu fonksiyon bize dizinin uzunluğunu hemen verecektir.
Fonksiyonu kullanmadan önce hemen fonksiyonun prototipine bakalım. Ne kadar ne işe yaradığını bilsek de ezbere kullanmak doğru olmaz.
Görüldüğü gibi strlen fonksiyonu tahmin ettiğimiz gibi bir karakter dizisi değeri alsa da karakter dizisinin boyutunu size_t biçiminde geri döndürmekte. Bu değeri geri dönen değeri (unsigned) çeviricisi ile işaretsiz tamsayıya çevirmemiz gerekir. Ya da %u yerine %zu yazmamız gerekiyor. Bunu dikkate alarak bir program yazalım.
Programı çalıştırdığımızda ekran görüntüsü şu şekilde olacaktır.
Görüldüğü gibi girdiğimiz metnin kaç karakterden oluştuğu burada yazdırılmakta. Yalnız strlen() fonksiyonunun bir eksikliği vardır o da boşluk bıraktığımız metinlerde boşluktan sonrasını okuyamamasıdır. Daha önceden sizeof operatörü ile de dizi boyutunun bulunduğundan bahsetmiştir. strlen burada bitirme karakterini saymadan dizi uzunluğunu bize vermektedir. sizeof ise bitirme karakterini (‘\0’) saymaktadır. Yukarıdaki programı eğer sizeof ile yapmış olsaydık 11 sonucunu elde ederdik.
Karakter dizilerini birleştirme
İki karakter dizisini birleştirmek için “+” işaretini kullanamayacağınızı biliyorsunuz değil mi? Bu bazı dillerde mümkün olsa da (mesela C++) C dilinde operatörleri aşırı yükleme denilen bir kavram yoktur. O yüzden dilin temel ögeleri ile halledilmeyen bütün işleri kısa yoldan fonksiyonlarla halletmemiz lazımdır. Bunun için strcat() fonksiyonunu kullanacağız. Öncelikle fonksiyonun ne olduğunu ve nasıl kullanıldığını öğrenmek için referanstan fonksiyon prototipine bakıyoruz.
Burada görüldüğü gibi bir kaynak bir de hedef olarak iki argüman almakta. strcat bir değer döndürse de bu referansta destination değeri olduğu belirtilmekte. Yani bu fonksiyon sonuc = a + b gibi bir işlem yapmak yerine a+=b gibi bir işlem yapmakta. Yani bizim destination olarak belirttiğimiz eklenecek kısım kalıcı değişikliğe uğramakta. Bunu düşünerek şöyle bir program yazalım.
Program çalıştığında ekran görüntüsü şöyle olacaktır.
Burada strcat fonksiyonu strcpy fonksiyonu kullanılarak oluşturulmuş. Aslında burada iş yapan fonksiyon strcpy fonksiyonuyken bu fonksiyon strcat bloku içerisinde standarda göre uyarlanmıştır. Şimdi ise gerçek bir fonksiyona bakalım.
Burada strcat fonksiyonunun bir döngü vasıtasıyla yapıldığını görmekteyiz. Elbette ki bütün bu kaynak kodlar derleyiciden derleyiciye değişmektedir. GCC derleyicisinde farklı Microsoft’un derleyicisinde farklı olabilir. Önemli nokta hepsinin standarda uymak zorunda olmasıdır. Eğer kendinizi derleyici yazanlardan daha iyi görüyorsanız bu fonksiyonları kullanmak yerine kendiniz de yazabilirsiniz.
String.h dosyasındaki fonksiyonlara ait kullanım, açıklama ve örnek kodları aşağıdaki referans sayfasından bulabilirsiniz.
Last updated
Was this helpful?