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