string類find函數返回值判定
代碼示例
#include<iostream> #include<cstring> using namespace std; int main() { static const size_t npos = -1; string s = "Alice Bob Charlie"; size_t position; position = s.find("none"); //position = s.find("Bob"); if (position >= 0) cout << "Found! position is : " << position << endl; else cout << "Not found!" << endl; }
現象&后果
程序運行結果輸出"Found! position is : 18446744073709551615",但實際上所找的字符串"none"並不存在於字符串s中。
Bug分析
程序的目的是,在源字符串s中查找目的字符串,若找到,則顯示"Found",並返回目標子串在源字符串中的位置;反之,若未找到,則返回"Not found"。string.find在未找到時會返回string::npos。
在C++中常量npos是這樣定義的:
- static const size_t npos = -1;
即常量npos定義的值為-1. 但又因為npos 的類型size_t是無符號整數類型,所以npos實際上是一個正數,並且是size_t類型的最大值。
上述代碼中,把find函數返回的值賦給size_t類型的變量position,而size_t類型的變量position是永遠大於等於0,所以即使find返回npos,if條件也為true。
正確的做法是在if條件中直接用npos作比較。
正確代碼
#include<iostream> #include<cstring> using namespace std; int main() { static const size_t npos = -1; string s = "Alice Bob Charlie"; size_t position; position = s.find("none"); if (position !=string::npos) cout << "Found! position is : " << position << endl; else cout << "Not found!" << endl; }