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.