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.

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.

size_t strlen ( const char * str );

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.

#include <stdio.h>
#include <string.h>

main()
{
	char karakter_dizisi[100] ="";
	puts("Olcmek istediginiz yaziyi yazin:\n");
	scanf("%s", karakter_dizisi);
	printf("Karakter Dizisinin Uzunlugu : %u", 
	(unsigned)strlen(karakter_dizisi));
}

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.

char * strcat ( char * destination, const char * source );

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.

#include <stdio.h>
#include <string.h>

main()
{
	char s1 [] = "AVR";
	char s2[] = "Mikrodenetleyici";
	printf("Ilk Karakter Dizisi : %s \n", s1);
	printf("Ikinci karakter dizis: %s \n",s2);
	strcat(s1, s2);
	printf("Birlestirilmis: %s",s1);
}

Program çalıştığında ekran görüntüsü şöyle olacaktır.

char *
STRCAT (char *dest, const char *src)
{
  strcpy (dest + strlen (dest), src);
  return dest;
}

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.

char *
strcat(char *dest, const char *src)
{
    size_t i,j;
    for (i = 0; dest[i] != '\0'; i++)
        ;
    for (j = 0; src[j] != '\0'; j++)
        dest[i+j] = src[j];
    dest[i+j] = '\0';
    return dest;
}

Kaynak: https://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/

Last updated