Dizi/Dizge Karşılaştırması
Önceki V. Oylum - Diziler ve Dizgeler Sonraki
Dizi/Dizge Karşılaştırması
Bu kısımdaki işlevleri dizi ve dizge içerikleri üzerinde karşılaştımalar yapmak için kullanabilirsiniz. Eşitliğin denetlenmesi kadar, ayrıca sıralama işlemleri için sıralama işlevleri olarak da kullanılabilirler. Bunun bir örneği olarak Arama ve Sıralama bölümüne bakınız.
C'deki çoğu karşılaştırma işleminin aksine, dizge karşılaştırma işlevleri dizgelerin eşitliğinin varlığında değil yokluğunda sıfırdan farklı bir değer ile dönerler. İşaretin değeri eşdeğer olmayan dizgelerin ilk karakterlerinin birbirine göre sırasına bağlıdır: Bir negatif değer ilk dizgenin ikincisinden "küçük", pozitif bir değer ise "büyük" olduğunu gösterir.
Bu işlevler çoğunlukla sadece eşitlik denetiminde kullanılırlar. Bu, ifade yazım kurallarına uygun olarak ! strcmp (s1, s2) gibi bir ifade ile yapılır.
Bu işlevlerin tümü string.h başlık dosyasında bildirilmiştir.
int memcmp
(const void *a1,
 const void *a2,
 size_t      boyut)
işlev
memcmp işlevi belleğin a1 de başlayan boyut baytı ile a2 de başlayan boyut baytını karşılaştırır. Dönen değer, ilk farklı bayt çiftleri arasındaki farkın işaretine bağlıdır (önce unsigned char türünden nesneler olarak yorumlanır, sonra da int türüne terfi ettirilirler).
İki bloğun içeriği aynı ise memcmp sıfır ile döner.
int wmemcmp
(const wchar_t *a1,
 const wchar_t *a2,
 size_t         boyut)
işlev
wmemcmp işlevi başlangıcı a1’de olan geniş karakterlerle başlangıcı a2’de olan geniş karakterleri karşılaştırır. a1’deki a2’dekinden farklı ilk geniş karakterin a2’dekinden küçük ya da büyük olmasına bağlı olarak sıfırdan küçük ya da büyük bir değerle döner.
İki bloğun içeriği aynı ise wmemcmp sıfır ile döner.
Keyfi değerli dizilerde memcmp işlevi çoğunlukla eşitlik denetiminde kullanılır. Genellikle, bayt dizileri dışındaki dizilerde bayt seviyesinde bir karşılaştırma anlamı değildir. Örneğin gerçek sayılardan oluşan dizilerin bayt seviyesinde karşılaştırılması gerçek sayıların değerleri arasındaki ilişki hakkında hiçbir şey söyleyemez.
wmemcmp işlevi, bir defada sizeof (wchar_t) bayta baktığından ve bunların sayısı sistem bağımlı olduğundan aslında sadece wchar_t türünde dizilerde kullanışlıdır.
Ayrıca memcmp işlevini, hizalama gereksinimlerinden dolayı aralarında boşluk bırakılmış yapı nesneleri, sonlarında fazladan boşluk bulunan birleşik yapılar ve ayrılan yere göre küçük olduklarından sonunda fazladan boşluk bulunan dizgeler gibi "delikler" içeren nesneleri karşılaştırırken dikkatli olmalısınız. Bu "delikler"in içerikleri düzensizdir ve bayt seviyesinden karşılaştırmalar tuhaf sonuçlara sebep olabilir.
Örneğin, aşağıdaki gibi bir yapı türü tanımında:
struct foo
  {
    unsigned char tag;
    union
      {
        double f;
        long i;
        char *p;
      } value;
  };
struct foo türündeki gibi nesneleri memcmp ile karşılaştırmak yerine özelleştirilmiş karşılaştırma işlevlerinin yazılmasını tercih etmelisiniz.
int strcmp
(const char *s1,
 const char *s2)
işlev
strcmp işlevi s1 ve s2 dizgelerini karşılaştırır. Dönen değer, ilk farklı karakter çiftleri arasındaki farkın işaretine bağlıdır (önce unsigned char türünden nesneler olarak yorumlanır, sonra da int türüne terfi ettirilirler).
İki dizgenin içeriği aynı ise strcmp sıfır ile döner.
strcmp işlevi tarafından kullanılan sıralamanın bir sonucu olarak, eğer s1 dizgesi s2 dizgesinin bir alt dizgesi ise s1 dizgesi, s2’den "küçük" kabul edilir.
strcmp işlevi dizgelerin yazıldıkları dilin sıralama teamüllerini almaz. Bunlardan birini almak için strcoll kullanın.
int wcscmp
(const wchar_t *ws1,
 const wchar_t *ws2)
işlev
wcscmp işlevi ws1 ve ws2 dizgelerini karşılaştırır. ws1’deki ws2’dekinden farklı ilk geniş karakterin ws2’dekinden küçük ya da büyük olmasına bağlı olarak sıfırdan küçük ya da büyük bir değerle döner.
İki dizgenin içeriği aynı ise strcmp sıfır ile döner.
wcscmp işlevi tarafından kullanılan sıralamanın bir sonucu olarak, eğer ws1 dizgesi ws2 dizgesinin bir alt dizgesi ise ws1 dizgesi, ws2’den "küçük" kabul edilir.
wcscmp işlevi dizgelerin yazıldıkları dilin sıralama teamüllerini almaz. Bunlardan birini almak için wcscoll kullanın.
int strcasecmp
(const char *s1,
 const char *s2)
işlev
Bu işlev harf büyüklükleri arasındaki farkları yok sayması dışında strcmp gibidir. Küçük ve büyük harfler arasındaki ilişki o an seçilmiş olan yerele bağlıdır. Standart "C" yerelinde Ä ve ä karakterleri eşleşmez ama, bu karakterleri alfabelerinde kullanan yerellerde eşleşirler.
strcasecmp BSD'den alınmıştır.
int wcscasecmp
(const wchar_t *ws1,
 const wchar_T *ws2)
işlev
Bu işlev harf büyüklükleri arasındaki farkları yok sayması dışında >wcscmp gibidir. Küçük ve büyük harfler arasındaki ilişki o an seçilmiş olan yerele bağlıdır. Standart "C" yerelinde Ä ve ä karakterleri eşleşmez ama, bu karakterleri alfabelerinde kullanan yerellerde eşleşirler.
wcscasecmp işlevi bir GNU oluşumudur.
int strncmp
(const char *s1,
 const char *s2,
 size_t      boyut)
işlev
Bu işlev ilk boyut karakterin karşılaştırılması dışında strcmp gibidir. Başka bir deyişle, iki dizgenin ilk boyut karakteri aynıysa işlev sıfırla döner.
int wcsncmp
(const wchar_t *ws1,
 const wchar_t *ws2,
 size_t         boyut)
işlev
Bu işlev ilk boyut geniş karakterin karşılaştırılması dışında wcscmp gibidir. Başka bir deyişle, iki dizgenin ilk boyut geniş karakteri aynıysa işlev sıfırla döner.
int strncasecmp
(const char *s1,
 const char *s2,
 size_t      n)
işlev
Bu işlev harf büyüklükleri arasındaki farkları yok sayması dışında strncmp gibidir. strcasecmp gibi küçük ve büyük harfler arasındaki ilişki o an seçilmiş olan yerele bağlıdır.
strncasecmp işlevi bir GNU oluşumudur.
int wcsncasecmp
(const wchar_t *ws1,
 const wchar_t *s2,
 size_t         n)
işlev
Bu işlev harf büyüklükleri arasındaki farkları yok sayması dışında wcsncmp gibidir. wcscasecmp gibi küçük ve büyük harfler arasındaki ilişki o an seçilmiş olan yerele bağlıdır.
wcsncasecmp işlevi bir GNU oluşumudur.
Aşağıdaki örnkelerde strcmp ve strncmp kullanımı gösterilmiştir. Bu örneklerin benzerleri geniş karakterler için de yazılabilir. Bu örneklerde ASCII karakter ümesinin kullanıldığı varsayılmıştır. (Diğer karakter kümeleri -- EBCDIC diyelim -- kullanılırsa, harfler farklı sayısal değerlerle ilişkilendirileceğinden dönen değerler ve sıralama farklı olacaktır.)
strcmp ("hello", "hello";)
    => 0    /* Bu iki dizge aynıdır. */
strcmp ("hello", "Hello")
    => 32   /* Karşılaştırma harf büyüklüklerine duyarlıdır. */
strcmp ("hello", "world")
    => -15  /* 'h' karakteri 'w'’den öncedir. */
strcmp ("hello", "hello, world")
    => -44  /* Bir boş karaktere karşılık virgül. */
strncmp ("hello", "hello, world", 5)
    => 0    /* İlk 5 karakter aynıdır. */
strncmp ("hello, world", "hello, stupid world!!!", 5)
    => 0    /* İlk 5 karakter aynıdır. */
int strverscmp
(const char *s1,
 const char *s2)
işlev
strverscmp işlevi s1 ve s2 dizgelerini indis/sürüm numarası içerdiğini varsayarak karşılaştırır. Dönen değer strcmp işlevindeki gibidir. Aslında, dizgeler bir rakam içermiyorsa işlev, strcmp işlevi gibi davranır.
Temel olarak, dizgeler için normal karşılaştırma (karakter karakter) uygulanır, dizgelerden birinde bir rakama rastlandığı anda özel karşılaştırma kipine girilir ve birbirini izleyen rakamlar bir bütün olarak ele alınır, sayılar arasında bir fark tespit edilemezse tekrar normal karşılaştırma kipine dönülür. İki tür sayılar vardır: "tamsayı" ve "ondalık kısım" (bunlar '0' ile başlar). Bu sayı türleri sıralamayı aşağıdaki sırada etkiler:
  • tamsayı/tamsayı: Bildik şekilde karşılaştırılır.
  • ondalık/tamsayı: Ondalık sayı tamsayıdan küçüktür. Burada da bir sürpriz yok.
  • ondalık/ondalık: Burası biraz karışık. Ondalık kısımların baştan en uzun sıfırlı olanı diğerinden küçüktür; aksi takdirde normal karşılaştırma yapılır.
strverscmp ("rakam yok", "rakam yok")
    => 0    /* strcmp ile aynı davranış. */
strverscmp ("item#99", "item#100")
    => <0   /* önekleri aynı, ama 99 < 100. */
strverscmp ("alpha1", "alpha001")
    => >0   /* ondalık kısım tamsayıdan küçüktür. */
strverscmp ("part1_f012", "part1_f01")
    => >0   /* iki ondalık kısım. */
strverscmp ("foo.009", "foo.0")
    => <0   /* keza, ama sıfır sayısı öncelikli. */
Bu işlev özellikle dosya ismi sıralamasında kullanılır, çünkü dosya isimleri genellikle indis/sürüm numaraları içerir.
strverscmp işlevi bir GNU oluşumudur.
int bcmp
(const void *a1,
 const void *a2,
 size_t      boyut)
işlev
Bu işlev BSD'den alınmıştır ve memcmp için eskimiş bir isimdir.
Önceki Üst Ana Başlık Sonraki
Kopyalama ve Birleştirme Başlangıç Dizgeleri Yerele Özgü Karşılaştırma İşlevleri
Bir Linux Kitaplığı Sayfası