2016-11-03 140 views
4

我試圖在字符串中找到一個字符,但我得到了意想不到的結果。我的理解是,string::find(char c)未找到時返回-1。但是,我收到了一些意想不到的結果。當使用== - 1時,string.find()返回true,但使用<0時返回false

即使該字符串不包含'8',它仍然會返回true

std::string s = "123456799"; 
if(s.find('8')<0) 
    cout << "Not Found" << endl; 
else 
    cout << "Found" << endl; 

//Output: Found 

然而,在使用時==不是代碼按預期工作。

std::string s = "123456799"; 
if(s.find('8')==-1) 
    cout << "Not Found" << endl; 
else 
    cout << "Found" << endl; 

//Output: Not Found 
+0

[請閱讀文檔](http://en.cppreference.com/w/cpp/string/basic_string/find)。它在哪裏說'std :: string_find'返回'-1'? – PaulMcKenzie

+1

@PaulMcKenzie std :: string_find返回string :: npos,如果找不到,string :: npos是'static const size_t npos = -1;' – user3196144

+1

@ user3196144注意'npos'的類型是無符號的;它的值初始化爲'-1'並不意味着它是負面的。並注意[這裏]的解釋(http://en.cppreference.com/w/cpp/string/basic_string/npos),「這是一個特殊的值,等於size_type類型表示的最大值。」 – songyuanyao

回答

7

我的理解是,string::find(char c)返回-1時,它找不到。

這並不準確。按照documentation

返回值
找到的子字符串或非營利組織的第一個字符的位置,如果沒有 這樣子被發現。

所以準確地說,當沒有找到時std::string::find將返回std::string::npos。關鍵是std::string::npos的類型是std::string::size_type,這是一個無符號整數類型。即使它從-1的值初始化,它不是-1;它仍然沒有簽名。所以s.find('8')<0將永遠是false,因爲它不可能是負面的。

std::string::npos文檔:

static const size_type npos = -1; 

這是由類型size_type等於表示的最大值的特殊值。

所以你應該使用std::string::npos來檢查結果,以避免這種混淆。

if (s.find('8') == std::string::npos) 
    cout << "Not Found" << endl; 
else 
    cout << "Found" << endl; 

if(s.find('8')==-1)工作得很好,因爲operator==左手操作數這裏是無符號,右手一個簽名。按照規則arithmetic operators

  • 否則,如果無符號操作數的轉換等級大於或等於符號操作數的轉換等級,符號操作數轉換爲無符號運算的類型。

所以-1將被轉換爲無符號,這是std::string::npos值,然後一切按預期工作。

1

string::find()返回size_t,這是一個無符號整數,因此它可以永遠是負的。

相關問題