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.

Peki biz strcat() fonksiyonunu kullanıyoruz ama arka planda neler işliyor diye sorabilirsiniz. Eğer böyle soruyorsanız iyi bir öğrencisiniz demektir! Arduino kitlesinden gördüğüm üzere pek çok Arduino kullanıcısı digitalWrite(), digitalRead() gibi fonksiyonlar ile program yazarken bu fonksiyonların arka planında neler olduğunu bir kere bile merak edip öğrenmek istememiştir. Merak edip işin derinini öğrenenler ise başarıya ulaşmıştır. Diğerleri ise yerinde saymaya devam etmektedir. O yüzden işin derinini merak edip öğrenmek isteyen hiçbir zaman zarar etmez. Bu soruya cevap vermek istersek strcat fonksiyonu bizim kullandığımız derleyicilerde kaynak kod olarak yer almamaktadır. Kendisi standart kütüphane içerisinde olduğundan derlenmiş halde gelir ve linker (bağlayıcı) vasıtasıyla bizim yazdığımız koda bağlanır. Böylelikle en performanslı şekilde kullanılmış olur. Fakat biz istersek internette çeşitli C derleyicilerinin kaynak kodlarını bulabiliriz. Her derleyicide bu fonksiyon birebir aynı değildir. Hatta yazıldığı sisteme göre bu kütüphane fonksiyonları değişiklik göstermektedir. Örneğin avr-gcc (AVR için C derleyicisi) derleyicisinde printf fonksiyonunu kullanmayı isteyeceğinizi hiç düşünmüyorum. Çünkü AVR mikrodenetleyicilerde çıktı alabileceğiniz bir ekran yoktur. 🙂 Benim bulduğum strcat için kaynak kodları şöyledir.

Kaynak : https://code.woboq.org/userspace/glibc/string/strcat.c.html

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.

Kaynakhttps://en.wikibooks.org/wiki/C_Programming/string.h/strcat

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.

http://www.cplusplus.com/reference/cstring/

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.