string類find函數返回值判定


 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是這樣定義的:

  1. 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;  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM