2014-12-01 68 views
0

過濾掉不好的話在我的C++ MUD遊戲,我希望能夠從能夠進入罵人的話消除玩家。你們都知道他們是什麼,不需要舉例。所以我嘗試這樣的事情:在MUD遊戲

vector<string> vulger = { "You know what goes in here"); 

void Player::SendString(const std::string& p_string) 
    { 
for (vector<string>::iterator it = vulger.begin(); it != vulger.end(); ++it) 
    { 
     if (!p_string.compare(*it) || !p_string.find(*it)) 
     { 
      //Testing what words are been neglected by the if statement. 
      //cout << *it; 
       Conn()->Protocol().SendString(*Conn(), p_string + newline); 
     } 
    } 

    } 

但是,所有這一切是通過發送到網絡的字符串循環。包括公告。

有人能看到什麼即時通訊做錯了或可能暗示什麼嗎?

+3

您的參數名爲'p_string',但您在循環中使用'!p_name'。什麼是'p_name'? – 2014-12-01 18:20:08

+0

對不起,他們只是我會現在編輯他們的錯別字。 – 2014-12-01 18:25:00

+0

不要在此處重新鍵入代碼。如果代碼不是您的實際代碼,那麼在代碼中發現問題是不可能的。重塑可以隱藏問題(或引入新問題,就像這裏發生的那樣)。請複製並粘貼。 – 2014-12-01 18:28:05

回答

0

改變你if聲明||&&

void Player::SendString(const std::string& p_string) 
    { 
     for (vector<string>::iterator it = vulger.begin(); it != vulger.end(); ++it) 
     { 
#if 0 
// Original: 
     if (!p_name.compare(*it) && !p_name.find(*it)) 
     { 
      Conn()->Protocol().SendString(*Conn(), p_string + newline); 
     } 
     else 
     { 
      cout << "Vulgar word found: " << *it << "\n"; 
     } 
#else 
// Edit 1: Changed ordering. 
     if ((p_name == *it) || (p_name.find(*it) != std::string::npos)) 
     { 
      cout << "Vulgar word found: " << *it << "\n"; 
     } 
     else 
     { 
      Conn()->Protocol().SendString(*Conn(), p_string + newline); 
     } 
#endif 

     } 
    } 
+0

從這個測試中發現,整個列表都是打印出來的,而不僅僅是輸入時的壞詞。 – 2014-12-01 18:42:33

+0

查看我的更改,「編輯1」。我把邏輯簡化爲*如果單詞粗俗,打印,或者發送單詞*。 – 2014-12-01 18:52:21

+0

使用更新後的版本,發送到網絡的所有內容都會循環多次,這與載體中的內容一樣多。 – 2014-12-01 18:55:53

0

你是治療的std::string::find返回值是一個布爾值,當,實際上,它返回一個偏移量與一個特殊的魔法值的字符串如果沒有找到npos

if (my_string.find("foo") == std::npos) { 
    // foo is NOT in my_string 
} else { 
    // foo is in my_string 
}