2013-02-10 62 views
0

所以如果我要進入帕特里夏(不要擔心即時通訊轉換toupper)該字符串將被加載到我的載體。 我的問題是關於查找功能。我正在倒數字符正確?所以如果我要進入帕特里夏,j將會在ABBOT上,那麼PATRICIA的逗號值就是5.好吧,迄今爲止,但是我發現的變量會發生什麼?C++:查找方法

bool NameSearch::findFirstNames(vector<string> &vsFirst, string name) 
{ 

int j = 0; 
bool bName = false; 
vsFirst.clear(); 

while(j < total) 
{ 
    int comma; 
    comma = names[j].find(','); 

      //Confused here 
    int found = names[j].find(name, comma); 

    if(found > -1) 
    { 
     vsFirst.push_back(names[j]); 
     bName = true; 
    } 

     j++; 
} 

return bName; 
} 
+1

什麼是'names'? – 2013-02-10 18:28:15

+0

即時通訊名稱是所有1000個名稱的數組。總數只有1000. – user1979708 2013-02-10 18:31:17

+0

while循環正在經歷文本文件中的每個名稱。 – user1979708 2013-02-10 18:34:10

回答

0

還有其他兩個答案,那點破什麼是錯,此代碼,但我覺得他們沒有一個向你解釋,作者正在做什麼,這就是你想要的解釋。 :)

讓我們先看下面的代碼片段。

int comma; 
comma = names[j].find(','); 

正如所指出的,它應該被重寫爲:

size_t comma; 
comma = names[j].find(','); 

有在std::string 上述代碼的find方法的4個重載使用這一個:

size_t find (char c, size_t pos = 0) const; 

它返回索引,在該索引處作爲第一個參數傳遞的字符(在你的情況下它是',')出現在條帶中g或std::string::npos如果找不到該字符。很顯然,作者確信','字符必須存在於字符串names[j]中,並且不檢查結果。

在行:

int found = names[j].find(name, comma); 

再次應該被重寫爲:

size_t found = names[j].find(name, comma); 

find方法的以下過載時:

size_t find (const string& str, size_t pos = 0) const; 

這一個搜索字符串names[j]爲第一次出現的字符串傳遞了一個這是第一個參數(在你的情況下爲name),並返回匹配開始的索引,如果匹配的話否則爲std::string::npos

如您所見,find方法中提到的兩個過載都有第二個參數,默認值爲0。這第二個參數允許用戶指定,在什麼指數開始查找的字符串搜索(你的情況names[j]

召喚:

comma = names[j].find(','); 

相當於電話:

comma = names[j].find(',', 0); 

,它的意思是:查找字符',' INT字符串names[j]從頭開始,並返回字符或std::string::npos中第一次出現的索引,如果在日沒有這樣的性格在字符串處。

召喚:

size_t found = names[j].find(name, comma); 

指:查找字符串names[j]在子等於name,但是從那裏逗號被發現的位置開始並返回字符串的第一個出現的索引或std::string::npos如果該字符串中沒有這樣的子字符串,則在逗號後面。

也許comma_position而不是comma本來是一個更好的變量名稱。

+0

很好的解釋。 – 2013-02-10 19:14:59

+0

非常感謝你!晶瑩剔透!!!!!!! – user1979708 2013-02-10 19:15:46

1

這是誤導性的代碼。 std::string::find()返回size_t,而不是int

int comma; 
comma = names[j].find(','); 

這是誤導性的代碼。當std::string::find()失敗時,它將返回std::string::npos,而不是-1。在您的環境中,巧合地相當於-1

if(found > -1) 

if語句被有效嘗試檢查「如果結果發現」通過確保它不是std::string::npos

+0

謝謝!它指定給string :: npos的奇怪數字是什麼? 4294967295 – user1979708 2013-02-10 19:07:42

+0

併爲此發現。現在我將其更改爲size_t – user1979708 2013-02-10 19:11:13

+0

@ user1979708這是一個保證不是有效的字符串索引的數字。這一切都很重要,但在您的特定情況下,恰好是2^32-1 – 2013-02-10 19:14:01

2

if (found > -1)測試可能適用於您的平臺,但技術上可疑。

std::string::find()返回類型爲std::string::size_type,如果你要搜索的字符串沒有找到,返回的值是std::string::npos(在另一方面,如果子被發現,返回值的字符索引其第一次出現)。

現在std::string::npos值恰好是std::string::size_type類型的最大可能值,如果這是unsigned int您的實現,這意味着與簽署 INT -1將產生true比較。

但是,沒有假設,一般可以作出對std::string::size_type類型。因此,我建議重寫測試爲:

if (found != std::string::npos) 
{ 
    ... 
} 
+0

謝謝!很高興你能爲我解決這個問題。 – user1979708 2013-02-10 19:06:35