3.3. Karakter Dizileri
C dilinde özel bir karakter dizisi
tipi
yoktur. Ancak karakter dizisi gerektiren durumlar için bazı kolaylıklar
bulunmaktadır. Karakterlerden oluşan normal bir dizi veya bir karakter
göstergesi bir karakter dizisi olarak düşünülebilir.
#include <stdio.h> int main (void) { char *dd; dd = "dunya"; printf("Merhaba, %s.\n", dd); return 0; }
Bildiğiniz gibi, printf
’in ilk
argümanı bir karakter göstergesi olmalıdır; bu örnekte, ikinci argüman da,
%s
dönüşüm tanımlamasının gerektirdiği şekilde, bir karakter
göstergesidir. Yukarıdaki atama ifadesinde olduğu gibi, bir ifade içinde
kullanılan bir karakter dizisi değişmezi bir karakter göstergesidir ve
dizinin ilk karakterine işaret eder. Karakter dizisi, derleyici tarafından,
bir tarafta saklanır. Böylece, yukarıdaki atama deyiminde sadece bir
gösterge ataması yapılmaktadır; bir karakter dizisi aktarması söz konusu
değildir. Eğer bir karakter dizisi aktarması yapmak istiyorsak bunu kendimiz
yapmalıyız. Örneğin,
char d[10]; d = "bir dizi";
geçersizdir, çünkü derleyici gösterge ataması
yapmaya çalışacaktır. Ancak
işaretinin sol
tarafında bir değişmez gösterge bulunduğundan, bu olanaksızdır.
Karakterleri tek tek, bir döngü kullanarak, atamak zorundayız. Böyle
işlemler çok sık kullanıldığı için, C kütüphanesi bazı
karakter dizisi işleme fonksiyonları sağlamaktadır. Örneğin,=
strcpy(d, "bir dizi");
bizim işimizi görecektir. Bu fonksiyon, ikinci
argüman olarak geçirilen adresteki bütün karakterleri, en sonda gelen boş
karakteri (\0
) ile birlikte, d
tarafından
gösterilen yere aktaracaktır. Bu durumda, bu 9 karakterdir. Bu fonksiyon,
hedef dizinin bu kadar çok karakteri alacak genişlikte olup olmadığını kontrol
etmez. (Zaten edemez.)
Benzer bir durum karakter dizileri karşılaştırması yaparken ortaya çıkar.
if (s=="Bu dizi") …
testi her zaman yanlış sonucunu verecektir. Kuşkusuz
bunun nedeni gösterge eşitliğini test etmemizdir. s
ya bir gösterge yada bir dizi ismi olabilir (her iki durumda
da bir gösterge ifadesidir); değişmez karakter dizisi ise onu saklamak için
kullanılan bellek öbeğinin başına işaret eden bir göstergedir. Doğal olarak,
bunlar farklı adreslerdir, böylece bu test hiçbir zaman doğru
sonucunu vermeyecektir. Bunun yerine, s1
ve s2
şeklinde verilen iki karakter dizisini karşılaştırıp,
sözlük sıralamasına göre s1
’in s2
’den
küçük, s2
’ye eşit veya s2
’den büyük
olmasına bağlı olarak, sırasıyla olumsuz bir tamsayı, sıfır veya olumlu bir
tamsayı veren
strcmp(s1,s2)
fonksiyonunu kullanmalıyız.
strcat(d,s)
fonksiyonu s
dizisini
d
’nin arkasına aktarır. Kuşkusuz d
dizisinin hem eski hem de yeni karakter dizisini kapsayacak kadar geniş
olması gerekir.
strlen(s)
fonksiyonu ise s
karakter dizisinin
uzunluğunu verir; bunu yaparken en sondaki boş karakteri saymaz.
strchr(s,c)
fonksiyonu c
karakterinin s
karakter dizisinin içinde ilk ortaya çıktığı yerin adresini bir karakter
göstergesi olarak döndürür; c
dizi içinde yoksa
NULL
verir.
strrchr(s,c)
fonksiyonu strchr(s,c)
gibidir,
sadece tarama işlemini sağdan sola doğru yapar.
Yukarıdaki fonksiyonlardan bazıları için işlemi sınırlayan başka
bir argüman, n
, kabul eden bazı
uyarlamalar bulunmaktadır.
strncmp(s1,s2,n)
en fazla n
karakteri karşılaştırır;
strncat(s1,s2,n)
en fazla n
boş olmayan
karakter ekler;
strncpy(s1,s2,n)
tam olarak n
karakter aktarır (eğer
s2
’nin uzunluğu daha kısa ise, boş karakterler
eklenir).
Yararlı bir değer döndürmüyor gibi gözüken fonksiyonlar aslında karakter göstergesi döndürmektedir. Genelde, geri döndürülen gösterge hedef dizisinin başına işaret eder.
Bir sonraki bölümde de göreceğimiz gibi, fonksiyonları
kullanmadan önce bildirimlerini yapmak zorundayız. Bu kısımda anlatılan
fonksiyonların bildirimi string.h
başlık dosyasında
bulunmaktadır. Yukarıda anlatılan fonksiyonları kullanmadan önce,
programın başına #include <string.h>
satırını eklememiz gerekir.
Diğer birçok fonksiyon yanında, C kütüphanesinde bazı veri
dönüşüm fonksiyonları da mevcuttur. Bunlardan bazılarının bildirimi
stdlib.h
başlık dosyasında bulunmaktadır ve aşağıda
açıklanmıştır. Ayrıca fonksiyon ve argüman tipleri de gösterilmiştir.
double atof(char *)
karakter dizisi argümanını çift duyarlıklı
kayan noktalı sayıya çevirir; hata durumunda 0.0
döndürür.
int atoi(char *)
karakter dizisi argümanını tamsayıya çevirir;
hata durumunda 0
döndürür.
long atol(char *)
karakter dizisi argümanını uzun tamsayıya
çevirir; hata durumunda 0L
döndürür.
ctype.h
başlık dosyasında tanımlanan
int toupper(int)
ve
int tolower(int)
sırasıyla karakter argümanının büyük harf ve küçük harf karşılığını döndürür.