ELN1002 BİLGİSAYAR PROGRAMLAMA 2 KARAKTERLER KARAKTER DİZİLERİ (STRING) Sunu Planı Karakterler ve Stringler Karakter İşleme Kütüphanesi String Dönüşüm Fonksiyonları Standart Giriş/Çıkış Kütüphane Fonksiyonları String Kütüphanesinin String İşleme Fonksiyonları String Kütüphanesinin Karşılaştırma Fonksiyonları String Kütüphanesinin Arama Fonksiyonları String Kütüphanesinin Bellek Fonksiyonları String Kütüphanesinin Diğer Fonksiyonları 1
Karakterler Karakterler, bilgisayar programlarının en temel yapı taşlarından birisidir. Arda arda anlamlı bir şekilde yerleştirilerek kelimeleri, kelimeler arda yerleştirilerek yazıları oluşturur. C programlama dizilerinde karakterler, karakter dizilerinin içinde tutulurlar. Karakter dizilerinin sonuna, genellikle NULL karakteri yerleştirilir. Karakter sabiti, tırnak içinde ifade edilen karakteri temsil eden bir tamsayı değeridir. z z nin ASCII değeri : 122 \n ASCII değeri : 10 String C Programlama dilinde string, \0 NULL karakteri ile sonlanan karakter dizilerine verilen isimdir. String, tek bir birim olarak düşünülebilecek bir karakter dizisidir. String, harfleri, rakamları ve özel karakterleri içerebilir. String sabitleri, C programlama dilinde çift tırnak ile yazılır: Elektronik Muhendisligi Oda No : 432 Gorukle, Bursa (224) 294 20 01 2
String String e string in ilk karakterini gösteren bir işaretçi ile erişilebilir. String in değeri, ilk karakterinin adresidir. Bundan dolayı, C programlama dilinde, string i bir işaretçi olarak görmek doğru olacaktır, string in ilk karakterine işaret eden bir işaretçidir. Bu anlamda, string bir dizi gibidir, diziler de ilk elemanlarının değerlerini gösterir. Bir karakter dizisi veya char* tipi, tanımlamasında bir string i ilk değer olarak alabilir. m char mavi[] = mavi ; a const char *mavi_ptr = mavi v char mavi[] = { m, a, v, i, \0 } i \0 String \0 karakterini içermeyen string leri ekrana yazdırmaya çalışmak bir hatadır. Bir karakter dizisine bellekte, \0 karakterini içermesini engelleyecek kadar az yer ayrılması bir hatadır. char yazi[20]; scanf( %s, yazi); yazi değişkeni bir dizi olduğu için & opeartörüne ihtiyaç yoktur. scanf boşluk, tab, \n veya EOF karakterleriyle karşılaşana kadar tüm karakterleri okur. Örneğimizde, 19 karakterden daha fazla karakter sayısına sahip bir giriş, programın hata üretmesine sebep olur. Bunu aşmanın yolu, %19s dönüşüm belirtecinin kullanılmasıdır. Bu yöntemle, ayrılan bellek bölgesinin taşarak takip eden alanlara bilgi yazılması engellenmiş olur. 3
Karakter İşleme Kütüphanesi Karakter işleme kütüphanesi, karakter verisi üzerinde faydalı bir takım testler veya işlemler gerçekleştirebileceğimiz çeşitli fonksiyonlar içerir. Her fonksiyon giriş olarak tamsayı ile temsil edilen bir karakter veya EOF alır. Daha önce de belirtildiği gibi, karakterler çoğu zaman bir tamsayı gibi işlenir, çünkü C de karakter genellikle 1 baytlık bir tamsayıdır. Standart karakter işleme kütüphanesi, ctype.h olarak adlandırılmıştır Karakter İşleme Kütüphanesi int isdigit(int c) int isalpha(int c) int isalnum(int c) int isxdigit(int c) int islower(int c) int isupper(int c) int isspace(int c) c karakteri bir sayı ise doğru (1) değil ise yanlış (0) değerini döndürür. c karakteri bir harf ise doğru (1) değil ise yanlış (0) değerini döndürür. c karakteri bir harf veya sayı ise doğru (1) değil ise yanlış (0) değerini döndürür. c karakteri bir hexadesimal (onaltılık sayı) ise doğru (1) değil ise yanlış (0) değerini döndürür. c karakteri bir küçük harf ise doğru (1) değil ise yanlış (0) değerini döndürür. c karakteri bir büyük harf ise doğru (1) değil ise yanlış (0) değerini döndürür. c karakteri eğer beyaz boşluk karakteri (, \n, \f, \r, \t, \v ) ise doğru (1) değil ise yanlış (0) değerini döndürür. 4
Karakter İşleme Kütüphanesi int iscntrl(int c) int ispunct(int c) int isprint(int c) int tolowerint c) int toupper(int c) c karakteri kontrol karakteri ise doğru (1) değil ise yanlış (0) değerini döndürür. c karakteri harf, sayı veya boşluktan başka herhangi bir yazılabilir karakter ise doğru (1) değil ise yanlış (0) değerini döndürür. c karakteri karakterini de içeren yazılabilir bir karakter ise doğru (1) değil ise yanlış (0) değerini döndürür. Eğer c karakteri büyük harf ise, bu karakteri küçük harfe dönüştürür, aksi takdirde işlem yapmaz. Eğer c karakteri küçük harf ise, bu karakteri büyük harfe dönüştürür, aksi takdirde işlem yapmaz. Karakter Tipleri Beyaz boşluk(whitespace) karakterleri:, \f, \n, \r, \t, \v isspace Kontrol Karakterleri: \t, \v, \f, \a, \b, \r, \n iscntrl Boşluk, sayı veya harfin dışındaki yazılabilir karakterler: $, #, (, ), [, ], {, }, ;, :, % ispunct Ekrana basılabilen tüm karakterler isprint (boşluk dahil) Ekrana basılabilen tüm karakterler isgraph (boşluk hariç) 5
Örnek String Dönüşüm Fonksiyonları Bu bölümde stdlib.h kütüphanesinden gelen fonksiyonlar üzerinden durulacaktır. Bu fonksiyonlar stringleri tamsayı(integer) veya kayar noktalı(floating point) sayı değerlerine dönüştürmektedir. 6
String Dönüşüm Kütüphanesi double atof(const char *nptr); int atoi(const char *nptr); int atol(const char *nptr); double strtod(const char *nptr, char **endptr); long strtol(const char *nptr, char **endptr, int base); unsigned long strtoul(const char *nptr, char **endptr, int base); nptr string ini double tipine dönüştürür. nptr stringini int tipine dönüştürür. nptr stringini long int tipine dönüştürür. nptr string ini double tipine dönüştürür. nptr stringini long tipine dönüştürür. nptr stringini unsigned long tipine dönüştürür. atof 7
atoi atol 8
strtod strtol 9
Standart G/Ç Kütüphanesi stdio.h int getchar(void); char *gets(char *s); int putchar(int c); int puts(const char *s) Stdin den gelen bir sonraki karakteri alır ve bir tamsayı olarak döndürür. EOF veya \n ile karşılaşana kadar stdin den gelen karakterler s dizisinin içine alır. Diziye bir \0 karakteri eklenir. s içine yazılan diziyi döndürür. s diziyi tutacak kadar büyük değilse hata oluşacaktır. c de tutulan karakteri ekrana yazdırır ve tamsayı değerini döndürür. s stringini ve onu takiben \n karakterini yazdırır. Başarılı olursa 0 olmayan bir tamsayı döndürür, tersi durumunda EOF döndürür. Standart G/Ç Kütüphanesi stdio.h int sprintf(char *s, const char *format, ); int sscanf(char *s, const char *format, ); printf le özdeştir fakat, çıkış ekrana yazdırılmak yerine bir dizinin içine yazdırılır. Başarılı olursa s içine yazdırılan karakterlerin sayısını, başarısız olursa EOF döndürür. scanf le özdeştir fakat, giriş klavye yerine bir s dizisinden okunur. Başarılı olursa fonksiyon tarafından okunan karakterlerin sayısını, başarısız olursa EOF döndürür. 10
sprintf sscanf 11
<string.h> kütüphanesi string işleme komutları char *strcopy(char *s1, const char *s2) char *strncopy(char *s1, const char *s2, size_t n) char *strcat(char *s1, const char *s2) char *strncat(char *s1, const char *s2, size_t n) s2 string ini s1 dizisine kopyalar. s1 in değeri döndürülür. s2 stringinin en çok n karakterini s1 dizisine kopyalar. s1 değerini döndürür. s1 dizisine s2 stringini ekler. s1 dizisinin \0 karakterinin yerine s2 stringinin ilk karakteri döndürülür. s1 dizisinin değeri döndürülür. s1 dizisine s2 stringinin en çok n karakterini ekler. s1 dizisinin \0 karakterinin yerine s2 stringinin ilk karakteri döndürülür. s1 dizisinin değeri döndürülür. strcopy ve strncopy 12
strcat ve strncat Karşılaştırma Fonksiyonları int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n) s1 stringini s2 string iyle karşılaştırır. Dönüş değeri: = 0 eşitlik varsa > 0 s1 s2 den büyükse < 0 s1 s2 den küçükse s1 stringinin n karakterini s2 string iyle karşılaştırır. Dönüş değeri: = 0 eşitlik varsa > 0 s1 s2 den büyükse < 0 s1 s2 den küçükse 13
strcmp ve strncmp Arama Fonksiyonları char *strchar(const char *s, int c); size_t strcspn(const char *s1, const char *s2); size_t strspn(const char *s1, const char *s2); char *strpbrk(const char *s1, const char *s2); c karakterinin s string i içindeki ilk kullanımını bulur. Eğer c bulunduysa, c nin s içindeki yerini işaret eden bir işaretçi döndürür, değilse NULL işaretçi döndürülür. s1 dizisi içinde s2 dizisinden herhangi bir elemanı içermeyen başlangıç parçasının uzunluğunu verir. s1 dizisi içinde s2 dizisindeki elemanların kaç kere kullanıldığınının sayısını verir. s2 stringinden herhangi bir karakterin s1 stringi içindeki ilk kullanımını bulur. s2 stringinden karakterle s1 stringi içinde ilk karşılaşıldığında, s1 içindeki karakterin yerini işaret eden bir işaretçi döndürülür. Aksi takdirde NULL işaretçi döndürülür. 14
strchr strcspn 15
strspn strpbrk 16
Arama Fonksiyonları char *strrchar(const char *s, int c); char *strstr(const char *s1, const char *s2); char *strtok(char *s1, const char *s2); c karakterinin s string i içindeki son kullanımını bulur. Eğer c bulunduysa, c nin s içindeki yerini işaret eden bir işaretçi döndürür, değilse NULL işaretçi döndürülür. s2 stringinin s1 stringi içindeki ilk kullanımını bulur. Eğer bulunduysa s1 içindeki string i işaret eden bir işaretçi döndürülür. Aksi takdirde NULL işaretçi döndürülür. strtok fonksiyona yapılan bir dizi çağrı, s1 stringini s2 stringinde içerilen karakterlerle parçalara böler. İlk çağrı s1 i ilk argüman olarak içerir, ardından gelen çağrılar aynı stringi ilk argümanı olarak NULL içerecek şekilde parçalamaya devam eder. Her çağrıyla geçerli parçaya bir işaretçi döndürülür. Eğer yeni bir parça oluşturulamıyorsa, NULL döndürülür. strrchar 17
strstr strtok 18
Bellek Fonksiyonları void *memcpy(void *s1, const void *s2, size_t n); void *memmove(void *s1, const void *s2, size_t n); int memcmp(const void *s1, const void *s2, size_t n); s2 tarafından gösterilen n karakterlik veri bloğunu s1 tarafından işaret edilen veri bloğuna kopyalar. Sonuç veri bloğuna bir işaretçi döndürür. s2 tarafından gösterilen n karakterlik veri bloğunu s1 tarafından işaret edilen veri bloğuna kopyalar. Kopyalama işlemi, veri bloğunun önce s2 işaretçisinin gösterdiği yerden geçici bir diziye daha sonra geçici diziden s1 işaretçisinin gösterdiği yere kopyalanması şeklinde gerçekleştirilir. Sonuç veri bloğuna bir işaretçi döndürür. s1 ve s2 işaretçileri tarafından işaret edilen veri bloklarının ilk n karakterini karşılaştırır. Dönüş değeri: = 0 eşitlik varsa > 0 s1 in gösterdiği s2 nin gösterdiğinden büyükse < 0 s1 in gösterdiği s2 nin gösterdiğinden küçükse memcpy 19
memmove memcmp 20
Bellek Fonksiyonları void *memchr(const void *s, int c, size_t n); void *memset(void *s, int c, size_t n); s işaretçisiyle işaret edilen veri bloğunun ilk n karakteri içinde c karakterinin(unsigned char a dönüştürülmüş) ilk kullanımını bulur. Eğer c bulunursa, veri bloğu içinde c nin yerini gösteren bir işaretçi döndürülür. Aksi takdirde, NULL döndürülür. s tarafından işaret edilen veri bloğunun ilk n karakterinin yerine c karakterini(unsigned char a dönüştürülmüş) yazar. Sonuca işaret eden bir işaretçi döndürülür. memchr 21
memset Diğer Fonksiyonlar size_t strlen(const char *s) s stringinin uzunluğunu bulur. NULL karakterinden önceki tüm karakterlerin sayısı döndürülür. 22
strlen 23