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

  • Commander Chalkboard

    Commander Ch

    20 Ocak 2014
  • foreignimage

    foreignimage

    13 HAZİRAN 2006
  • GWTLecturer

    GWTLecturer

    18 EKİM 2012