SORU
11 Ocak 2011, Salı


Nasıl bir dize C ile bir sayı olup olmadığını belirlemek için ?

Bir sürü bela bir dize olmadığını denetler bir numara olduğunu bir fonksiyon yazmaya çalışarak geçirdim. Eğer okuyorum dosyasından bir satır numarası olup olmadığını ben yazıyorum bir oyun için kontrol etmeniz gerekir (Eğer bir parametre ise bu şekilde bilemeyeceğim). Sorunsuz çalışıyordu sanırım aşağıdaki gibi bir fonksiyon (ya da ben yanlışlıkla bunu durdurmak için düzenlenmiş ya da şizofren olduğumu ya da Windows şizofren) yazdı:

bool isParam(string line){
    if(isdigit(atoi(line.c_str()))) return true;
    return false;
}        

CEVAP
11 Ocak 2011, Salı


En etkili yolu sadece rakam olmayan bir karakter bulana kadar dize üzerinde yineleme olacaktır. Eğer rakam olmayan herhangi bir karakter varsa, bir dize, bir sayı değil düşünebilirsiniz.

bool is_number(const std::string& s)
{
    std::string::const_iterator it = s.begin();
    while (it != s.end() && std::isdigit(*it))   it;
    return !s.empty() && it == s.end();
}

Ya da eğer C 11 gibi yapmak istiyorsanız:

bool is_number(const std::string& s)
{
    return !s.empty() && std::find_if(s.begin(), 
        s.end(), [](char c) { return !std::isdigit(c); }) == s.end();
}

Aşağıdaki yorum da belirttiği gibi, bu sadece pozitif tamsayılar için de çalışır. Eğer negatif tam sayı ya da kesir tespit etmek gerekirse, daha sağlam kütüphane tabanlı bir çözüm ile gitmeli. Negatif tamsayılar için destek ekleyerek rağmen oldukça saçmadır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dylan Dubay

    Dylan Dubay

    10 Temmuz 2013
  • IGN

    IGN

    19 EYLÜL 2006
  • Nightmare2005

    Nightmare200

    14 Ocak 2007