Tamsayıların Çözümlenmesi
Önceki Dizgelerdeki Sayıların Çözümlenmesi Sonraki
Tamsayıların Çözümlenmesi
str işlevleri stdlib.h dosyasında, wcs ile başlayanlar ise wchar.h dosyasında bildirilmiştir. Bu bölümdeki işlevlerin prototiplerinde restrict kullanımı şaşırtıcı olabilir. Kullanışsız görünür ama ISO C standardı onu kullandığı için (burada tanımlı işlevler için) biz de kullandık.
long int strtol
(const char *restrict dizge,
 char **restrict      kalan-dizge,
 int                  taban)
işlev
strtol ("string-to-long" kısaltması) işlevi dizge dizgesinin baştarafını bir işaretli tamsayıya dönüştürür ve sonucu long int türünde bir değer olarak döndürür.
İşlev dizge'yi şu şekilde analiz etmeye çalışır:
  • Boşluk karakterlerinden oluşan bir dizge (muhtemelen boş). Boşluk karakterleri isspace işlevi ile saptanır ve bunlar iptal edilir (bkz. Karakterlerin Sınıflandırılması).
  • İsteğe bağlı artı ya da eksi işareti (+ veya -).
  • Tabanı taban ile belirtilen aralarında boşluk olmayan rakamlar.
    taban sıfırsa, rakam dizgesi 0 (sekizlik taban belirtir) ile ya da 0x veya 0X (onaltılık taban belirtir)ile başlamıyorsa rakamların onluk tabanda verildiği varsayılır; yani C'deki tamsayı sabit sözdizimi kullanılır.
    Aksi takdirde taban, 2 ile 36 arasında olmalıdır. Eğer taban olarak 16 verilmişse, rakam dizgesi isteğe bağlı olarak 0x veya 0X ile başlayabilir. Eğer taban olarak kuraldışı bir değer belirtilmişse 0l değeri dömer ve errno değişkenine EINVAL atanır.
  • Dizgede kalan karakterler. Eğer kalan-dizge bir boş gösterici değilse işlev bu artıkları *kalan-dizge içine yerleştirir.
Eğer dizge boşsa, sadece boşluk karakterleri içeriyorsa ya da başlangıçtaki altdizge taban ile belirtilen bir tamsayı için umulan sözdizimine sahip değilse hiçbir dönüşüm yapılmaz. Bu durumda, işlev sıfırla döner ve dizge değeri *kalan-dizge içine yerleştirir.
Yerel, standart "C" yerelinden farklıysa, bu işlev gerçeklemeye bağlı olarak ek sözdizimini tanıyabilir.
Eğer dizge geçerli sözdizimine sahip olduğu halde taşmadan dolayı değer gösterilemiyorsa, değerin işaretine bağlı olarak LONG_MAX ya da LONG_MIN döner (bkz. Bir Tamsayı Türün Aralığı). Ayrıca taşmayı belirtmek üzere errno değişkenine ERANGE atanır.
strtol işlevinin döndürdüğü değere bakarak hata sınaması yapmayın, çünkü dizge 0l, LONG_MAX veya LONG_MIN gibi sözdizimsel olarak geçerli bir sayı olabilir. Bunun yerine kalan-dizge'nin gösterdiği dizgenin sayıdan sonra umduğunuz dizgeyi içerip içermediğine bakın. Örneğin dizge sayıdan sonra başka bir karakter içermiyorsa dönüş değerinde '\0' varlığına bakarsınız. Ayrıca çağrı öncesi errno değişkenine sıfır atayıp çağrıdan sonra değişkenin değerine bakarak taşma durumu olup olmadığını saptayabilirsiniz.
Bu bölümün sonunda bir örnek bulacaksınız.
long int wcstol
(const wchar_t *restrict dizge,
 wchar_t **restrict      kalan-dizge,
 int                     taban)
işlev
wcstol işlevi geniş karakter kabul etmesi dışında hemen herşeyiyle strtol işlevine benzer.
wcstol işlevi ISO C90'ın 1. düzeltmesinde vardı.
unsigned long int strtoul
(const char *retrict dizge,
 char **restrict     kalan-dizge,
 int                 taban)
işlev
strtoul ("string-to-unsigned-long" kısaltması) işlevi sonucu bir unsigned long int değer olarak döndürmesi dışında strtol işlevi gibidir. Sözdizimi strtol işlevindeki gibidir. Taşma durumunda dönüş değeri ULONG_MAX'tır (bkz. Bir Tamsayı Türün Aralığı).
dizge içinde bir negatif sayı varsa, strtoul işlevi strtol işlevi gibi davranır ama sonucu bir işaretsiz tamsayıya dönüştürür. Örneğin, işlev "-1" dizgesi için ULONG_MAX ile, girdi LONG_MIN'den daha negatifse (ULONG_MAX + 1) / 2 ile döner.
Eğer taban kapsamdışı ise işlev errno değişkenine EINVAL değerini, taşma durumunda ise ERANGE değerini atar.
unsigned long int wcstoul
(const wchar_t *restrict dizge,
 wchar_t **restrict      kalan-dizge,
 int                     taban)
işlev
wcstoul işlevi geniş karakteleri kabul etmesi dışında hemen herşeyiyle strtoul işlevinin benzeridir.
wcstoul işlevi ISO C90'ın 1. düzeltmesinde vardı.
long long int strtoll
(const char *restrict dizge,
 char **restrict      kalan-dizge,
 int                  taban)
işlev
strtoll işlevi daha büyük değer kabul ederek sonucu long long int türünde bir değer olarak döndürmesi dışında strtol gibidir.
Eğer dizge geçerli sözdizimine sahip olduğu halde taşmadan dolayı değer gösterilemiyorsa, değerin işaretine bağlı olarak LONG_LONG_MAX ya da LONG_LONG_MIN döner (bkz. Bir Tamsayı Türün Aralığı). Ayrıca taşmayı belirtmek üzere errno değişkenine ERANGE atanır.
strtoll işlevi ISO C99'da tanıtıldı.
long long int wcstoll
(const wchar_t *restrict dizge,
 wchar_t **restrict      kalan-dizge,
 int                     taban)
işlev
wcstoll işlevi geniş karakter kabul etmesi dışında hemen herşeyiyle strtoll işlevine benzer.
wcstoll işlevi ISO C90'ın 1. düzeltmesinde vardı.
long long int strtoq
(const char *restrict dizge,
 char **restrict      kalan-dizge,
 int                  taban)
işlev
strtoq ("string-to-quad-word" kısaltması) işlevistrtoll işlevinin BSD ismidir.
long long int wcstoq
(const wchar_t *restrict dizge,
 wchar_t **restrict      kalan-dizge,
 int                     taban)
işlev
wcstoq işlevi geniş karakter kabul etmesi dışında hemen herşeyiyle strtoq işlevine benzer.
wcstoq işlevi bir GNU oluşumdur.
unsigned long long int strtoull
(const char *restrict dizge,
 char **restrict      kalan-dizge,
 int                  taban)
işlev
strtoul işlevinin strtol işlevine ilgisi gibi strtoull işlevi de strtoll işleviyle benzer ilgiye sahiptır.
strtoull işlevi ISO C99'da tanıtıldı.
unsigned long long int wcstoull
(const wchar_t *restrict dizge,
 wchar_t **restrict      kalan-dizge,
 int                     taban)
işlev
wcstoull işlevi geniş karakter kabul etmesi dışında hemen herşeyiyle strtoull işlevine benzer.
wcstoull işlevi ISO C90'ın 1. düzeltmesinde vardı.
unsigned long long int strtouq
(const char *restrict dizge,
 char **restrict      kalan-dizge,
 int                  taban)
işlev
strtouq işlevi strtoull işlevinin BSD ismidir.
unsigned long long int wcstouq
(const wchar_t *restrict dizge,
 wchar_t **restrict      kalan-dizge,
 int                     taban)
işlev
wcstouq işlevi geniş karakter kabul etmesi dışında hemen herşeyiyle strtouq işlevine benzer.
wcstouq işlevi bir GNU oluşumdur.
intmax_t strtoimax
(const char *restrict dizge,
 char **restrict      kalan-dizge,
 int                  taban)
işlev
strtoimax işlevi daha büyük değerler kabul ederek sonucu intmax_t türünde döndürmesi dışında strtol gibidir.
Eğer dizge geçerli sözdizimine sahip olduğu halde taşmadan dolayı değer gösterilemiyorsa, değerin işaretine bağlı olarak INTMAX_MAX ya da INTMAX_MIN döner (bkz. Bir Tamsayı Türün Aralığı). Ayrıca taşmayı belirtmek üzere errno değişkenine ERANGE atanır.
intmax_t türü hakkında daha fazla bilgi için Tamsayılar bölümüne bakınız. strtoimax işlevi ISO C99'da tanıtıldı.
intmax_t wcstoimax
(const wchar_t *restrict dizge,
 wchar_t **restrict      kalan-dizge,
 int                     taban)
işlev
wcstoimax işlevi geniş karakter kabul etmesi dışında hemen herşeyiyle strtoimax işlevine benzer.
wcstoimax işlevi ISO C99'da tanıtıldı.
uintmax_t strtoumax
(const char *restrict dizge,
 char **restrict      kalan-dizge,
 int                  taban)
işlev
strtoul işlevinin strtol işlevine ilgisi gibi strtoul işlevi strtoumax işleviyle de benzer ilgiye sahiptır.
intmax_t türü hakkında daha fazla bilgi için Tamsayılar bölümüne bakınız. strtoumax işlevi ISO C99'da tanıtıldı.
uintmax_t wcstoumax
(const wchar_t *restrict dizge,
 wchar_t **restrict      kalan-dizge,
 int                     taban)
işlev
wcstoumax işlevi geniş karakter kabul etmesi dışında hemen herşeyiyle strtoumax işlevine benzer.
wcstoumax işlevi ISO C99'da tanıtıldı.
long int atol
(const char *dizge)
işlev
Bu işlev taban argümanı 10 olarak belirtilen strtol işlevine benzer, ancak taşma hatalarının saptanmasını gerektirmez. atol işlevi mevcut kodla uyumluluk adına vardır; strtol kullanım bakımından daha güçlüdür.
int atoi
(const char *dizge)
işlev
Bu işlev int türünde bir değer döndürmesi dışında atol işlevi gbidir. Ayrıca, atoi işlevinin atıl olduğu varsayılır; yerine strtol kullanın.
long long int atoll
(const char *dizge)
işlev
Sonucu long long int türünde döndürmesi dışında atol işlevine benzer.
atoll işlevi ISO C99'da tanıtıldı. Tamamen atıldır; yerine strtoll kullanın.
Buraya kadar bahsedilen işlevler artık yerel veride tanımlanan diğer gösterimleri tanımamaktadır. Bazı yereller çok büyük sayıların daha rahat okunabilmesi için binler ayracı kullanmaktadır. Böyle sayıları okutmak için scanf işlevini ' imi ile kullanın.
Bu örnekte bir işlev bir dizgeyi çözümleyip elde ettiği tamsayıların toplamı ile dönmektedir:
int
sum_ints_from_string (char *string)
{
  int sum = 0;

  while (1) {
    char *tail;
    int next;

    /* Baştaki boşlukları atlayalım.  */
    while (isspace (*string)) string++;
    if (*string == 0)
      break;

    /* Artık boşluk karakeri kalmadı,  */
    /* rakamlara bakabiliriz.  */
    errno = 0;
    /* Çözümle.  */
    next = strtol (string, &tail, 0);
    /* Taşmamışsa, ekle.  */
    if (errno)
      printf ("Taştı\n");
    else
      sum += next;
    /* Kalan dizgeyi tekrar işleme sokalım.  */
    string = tail;
  }

  return sum;
}
Önceki Üst Ana Başlık Sonraki
Dizgelerdeki Sayıların Çözümlenmesi Başlangıç Gerçek Sayıların Çözümlenmesi
Bir Linux Kitaplığı Sayfası