2012-02-03 24 views
0

我有一個新的函數removeInelligibleCharsFromTargetName函數不允許比較字符串中的單個字符 - C++

void removeInelligibleCharsFromTargetName(string *targetName) 
{ 
    for(int i = 0; i < targetName->length(); i++) 
    { 
     for(int j = 0; j < ineligibleChars.length(); j++) 
     { 
      if(targetName[i] == ineligibleChars[j]) 
       targetName[i] = '_'; 
     } 
    } 
} 

問題是,當我嘗試在如果環我得到以下錯誤的比較:

error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::string' (or there is no acceptable conversion) 32> c:\program files\microsoft sdks\windows\v6.0a\include\guiddef.h(192): could be 'int operator ==(const GUID &,const GUID &)' while trying to match the argument list '(std::string, char)'

但是把那個完全相同的嵌套循環回來,我把它而不是調用函數吧工作正常。

有人可以告訴我乳清它不會在一個函數中工作,但可以在函數外正常工作。毫無疑問,它是一個指針,但我不知道是什麼。

回答

5

你爲什麼把一個指針傳遞給string?這是一個非常糟糕的主意。通過參考。

void removeInelligibleCharsFromTargetName(string& targetName) 
{ 
    for(int i = 0; i < targetName.length(); i++) 
    { 
     for(int j = 0; j < ineligibleChars.length(); j++) 
     { 
      if(targetName[i] == ineligibleChars[j]) 
       targetName[i] = '_'; 
     } 
    } 
} 

的問題是,當你有一個指針,targetName[i]相同*(targetName+i)這相當於將索引編入字符串數組。如果你沒有一個字符串數組,這隻會導致未定義的行爲。你很幸運,代碼不能編譯(不能比較字符串和字符),編譯器發現錯誤。如果它碰巧編譯,當你運行它時,你可能會觀察到一些非常奇怪的行爲。

當你有一個string,或者一個參考,targetName[i]調用的字符串,其索引到字符串,實際上給你一個字符operator[]

+0

我認爲您發現了該錯誤:)。 – 2012-02-03 16:33:47

+0

我真的不知道。週五晚上的晚上是我所有....... 謝謝 – discodowney 2012-02-03 16:35:25

0

targetName[i]的每次出現更改爲(*targetName)[i]。或者,就像R.馬蒂尼奧費爾南德斯建議並通過參考而不是指針一樣。

0

targetName時是一個指針,該代碼

if(targetName[i] == ineligibleChars[j]) 
    targetName[i] = '_'; 

嘗試索引從指針,就像它已經(指針)的陣列。要訪問實際指向的字符串,您需要在索引到字符串前取消引用指針

if((*targetName)[i] == ineligibleChars[j]) 
    (*targetName)[i] = '_';