Geniş Karakter Sınıflarının Kullanılması
Önceki IV. Oylum - Karakterle Çalışma Sonraki
Geniş Karakter Sınıflarının Kullanılması
İlk uyarı, şüphesiz şaşırtıcı değil ama hala arasıra sorun çıkarmaktadır. iswXXX işlevleri makrolarla gerçeklenebilir ve GNU C kütüphanesi böyle yapar. Onlar yine de gerçek işlevler olarak kullanılabilirse de wctype.h başlık dosyası içerildiğinde makrolar kullanılacaktır. Bu durum, bu işlevlerin char türü olanları için de aynıdır.
İkincisi daha yeni bir bilgidir. En iyisi bir örnekle açıklamak. Kodun ilk parçasını özgün koddan (biraz kısaltarak) seçelim.
int is_in_class (int c, const char *class)
{
  if (strcmp (class, "alnum") == 0)
    return isalnum (c);
  if (strcmp (class, "alpha") == 0)
    return isalpha (c);
  if (strcmp (class, "cntrl") == 0)
    return iscntrl (c);
  …
  return 0;
}
Şimdi, wctype ve iswctype ile if merdiveninden kurtulabilirsiniz, ancak aşağıdaki gibi bir kod yanlış olacaktır:
int is_in_class (int c, const char *class)
{
  wctype_t desc = wctype (class);
  return desc ? iswctype ((wint_t) c, desc) : 0;
}
Burada sorun, bir tek baytlık karakterin geniş karakter karşılığının tür dönüşümü ile elde edilebilirliğinin garantili olmayışıdır. Doğru çözüm, kodu aşağıdaki gibi yazmaktır:
int is_in_class (int c, const char *class)
{
  wctype_t desc = wctype (class);
  return desc ? iswctype (btowc (c), desc) : 0;
}
btowc işlevi hakkında bilgi edinmek için Bir Karakterin Dönüştürülmesi bölümüne bakınız. Burada, wctype işlevi hala bir dizge karşılaştırması yaptığından yazılımın başarımı arttırılmış olmayacaktır. is_in_class işlevi aynı sınıf ismi için defalarca çağrılırsa durum gerçekten ilginç olur. Bu durumda, desc değişkeni bir kere hesaplanıp tüm çağrılarda kullanılmalıydı. Bu nedenle işlevin yukardaki şekli şüphesiz işlevin son hali olmayacaktır.
Önceki Üst Ana Başlık Sonraki
Geniş Karakterlerin Sınıflandırılması Başlangıç Geniş Karakterlerde Büyük-küçük Harf Dönüşümleri
Bir Linux Kitaplığı Sayfası