Standart string kütüphanesi fonksiyonlarında geri dönüş değeri olarak “unsigned int”

Birçok yerde denk geldiğim için bununla ilgili bir blog yazısı yazmanın iyi olacağını düşünüyorum. Şimdi aşağıdaki koda bir bakmanızı rica ediyorum, ekrana ne yazılmasını bekliyorsunuz ?

#include    <iostream>
#include    <string>

using namespace std;

int main()
{
    string s("cppturkey");

    unsigned int index = s.find_last_of(".");

    if (index == string::npos)
        cout << "Nokta namevcut" << endl;
    else
        cout << "Nokta mevcut" << endl;

    return 0;

}

Aslında bu sorunun bir cevabı yok, sistemden sisteme değişebilir. string operasyonları geri dönüş değeri “size_t” türündendir. size_t ise standartlarda mevcut sistemin en yüksek pozitif alabileceği değerdir(pozitif -1). Aşağıdaki örneğe göz atabilirsiniz.


#include <iostream>
#include <string>

using namespace std;

int main()
{
unsigned int x = -1;
size_t y = -1;

cout << x << endl;
cout << y << endl;
return 0;

}

 

Türler arasındaki bağlantı C++ standartların aşağıdaki şekilde tanımlanmıştır ve garanti altındadır:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) = sizeof(size_t) <= sizeof(long long)

Dolayısıyla kullandıgınızda sistemde sizeof(unsigned int), sizeof(size_t)'dan farklı olabilir. Küçük olduğu durumlarda integer overflow olduğundan 'index == string::npos' ifadesi doğru olmayacak ve ekrana "Nokta mevcut" yazacaktır.

Garantili yol ise index değişkenini size_t türünden;

size_t index = s.find_last_of(".");

şeklinde tanımlamak olacaktır.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s