Temel C Programlama -39- Karakter Dizileri (String)

Bu başlıkta C dilinde karakter dizilerine giriş yapacağız ve size uygulamalı olarak göstereceğiz. Karakter dizileri daha önce söylediğimiz gibi karakter tipindeki bir dizi yapısından oluşmaktaydı. Bunun mantığını anlamanız aslında çok kolaydır. Daha önce söylediğimiz gibi üstü kapalı hiçbir yer yoktur ve oldukça basittir. Mantığını kavramanız kolay olsa da sonrasında karşımıza pek çok metin işlem fonksiyonu çıkacaktır. Bu fonksiyonlar karakter dizileri üzerinde işlem yapmamız için gereklidir. Hepsini ezberlemenize gerek olmasa da elimizin altındaki fonksiyonların ne yaptığını ve ihtiyacınız olduğunda nerede bulacağınızı bilmeniz gerekir. Öncelikle karakter dizilerinin mantığını anlatmakla konuya devam edelim.

Nedir Bu Karakter Dizileri?

Karakter dizileri (string) belli sayıda bir karakter verisinin sıralanmış haline denir. C dilinde bu diziler vasıtasıyla tanımlanır ve veri tipi char olmak zorundadır. Bazı dillerde String sınıfı olup karakter dizileri aynı değişkenler gibi kullanılmakta hatta “+” operatörü ile karakter dizileri birbirine eklenmektedir. C dilinde ise bu tarz yerleşik özelliklerin yerine standart kütüphanede gelen karakter dizileri ve karakterlerle alakalı fonksiyonlar kullanılır. Dil yapısına yerleşik bir karakter dizisi yoktur.

Bilmeniz gereken en önemli noktalardan biri ise C dilinde bütün karakter dizilerinin “\0” karakteri ile bittiğidir. Bu karakter ekranda yazdırılmaz fakat program tarafından okunur ve karakter dizisinin bittiği böylece anlaşılır. Yazdığınız programlarda sürekli “\0” karakterini denetleyen bir şart ifadesi kullanmak zorunda kalırsınız. Çünkü C dilinde dizinin bittiği ancak böyle anlaşılmaktadır. “\0” karakterini biz kendimiz koymayız derleyici otomatik olarak bunun karakter dizisi olduğunu anlar ve koyar. Örnek bir karakter dizisi tanımlaması şu şekillerde olabilir.

char kart[] = "Arduino";

const char *kartptr = "Arduino";

Görüldüğü gibi tanımladığımız bir dizi veya işaretçi olmasına rağmen buna “Arduino” şeklinde bir karakter dizisi değerini ekleyebiliyoruz. Normalde dizide her bir değere ayrı ayrı değer vermemiz gerekirken burada bir istisna olarak bu şekilde yazabiliyoruz. Eğer böyle olmasaydı karakter dizilerine veri atamak aşırı derecede zor olurdu. Aynı şekilde bir işaretçiye de normalde ancak adres değeri atayabilirken char olması durumunda “Arduino” şeklinde karakter dizisi değeri aktarabiliriz. Elbette bu değer aktarma işleminin görünüşte olduğunu unutmayın. İşin aslında hafızada “Arduino” diye bir karakter dizisi sabiti kayıt edilir ve işaretçi bunun ilk elemanını (A harfini) işaret eden bir değere sahip olur. “Arduino” değerini yazdırmak istediğimizde A, r, d, u, i, n, o diye harfler sırayla yazdırılmaya devam eder ta ki ‘\0’ karakterine gelene kadar. Eğer ‘\0’ karakteri okunmazsa program nerede duracağını bilemez. Bunlar istisnadır ve “\0” bitiş karakterinin yanında diziler hakkında bilmeniz gereken en önemli bilgilerdendir.

Eğer biz isteseydik normal bir dizi tanımlar gibi de karakter dizisini tanımlayabilirdik. Bu C dilinin alışılageldik yapısına uygun olsa da oldukça kullanışsız olacaktır. Yine de böyle bir yaklaşım bunun mantığını kavramanız için oldukça önemlidir. Şimdi yukarıda char kart[] = “Arduino”; diye tanımladığımız karakter dizisinin aslında ne olduğunu görelim.

char kart [] = { 'A', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};

Eğer biz bilindik bir şekilde böyle tanımlamak istesek kendimiz ‘\0’ karakterini koymak zorunda kalırız. Çünkü derleyici bunun karakter dizisi olduğunu anlamaz ve bütün denetimi bizim elimize bırakır. Yukarıda daha pratik bir şekilde tanımladığımız karakter dizisi aslında bu şekildedir. Her harf birer char değeri olarak karşımıza çıkar ve sonundaki bitirme karakteri ‘\0’ ise yine özel bir komut sembolü olarak ASCII tablosunda yer almakta. Bütün bilgisayarlar ‘\0’ komutunu okuduğunda karakter dizisinin bittiğini anlayacaktır. Biz normalde program yazarken böyle bir karakter dizisi tanımlaması kullanmayız. Yukarıda verdiğim iki örnekten birini kullanırsınız. Eğer değişken karakter dizisi olacaksa char isim[] şeklinde eğer sabit bir karakter dizisi olacaksa const char *ptr şeklinde tanımlayabilirsiniz. C dilinde iki tırnak işareti (“”) arasına yazılan harf, rakam ve sembollerin de karakter dizisi olarak değerlendirildiğini biliyoruz. Biz bunu hiç ‘\0’ karakterini düşünmeden tanımlasak da program işleyişinde ‘\0’ karakteri sıklıkla karşımıza çıkacaktır.

Size karakter dizilerini tanımlamakla alakalı son bir ipucunu vereceğim. Yukarıda verdiğimiz iki tanımlamada da karakter dizileri ilk değerini almakta ve buna göre tanımlamada boyutlanmaktaydı. Fakat bir program başında boş bir karakter dizisi tanımlayabilir program akışında kullanıcıdan veya çevreden alacağımız veri ile bunu doldurmak isteyebiliriz. Örneğin bir mikrodenetleyici seri iletişim vasıtasıyla aldığı baytları (haliyle karakterleri) bir tampon belleğe kaydetme ihtiyacı duyabilir. Bu tampon bellek ise normalde boş olacak fakat gelen veriye göre sırayla dolması gerekecek. Bu durumda bir makul bir boyutta boş bir karakter dizisi tanımlayabiliriz. Bunu da şöyle yaparız.C++

char buffer [50] = "";
// ya da 
char buffer [50] = {'\0'};

Burada statik veri tahsisinde (allocation) geçerli olan tanımlamaları verdik. Dinamik veri ileri bir konu olduğu için gerektiği zaman bundan bahsedeceğiz. Buraya kadar anladıysanız bundan sonrası C standart kütüphanelerini kullanarak ve yazdığımız algoritmalarla metin işlem uygulamaları yapmaktır.

Last updated