即使if语句被命中,计数也不会递增

时间:2014-12-17 17:59:26

标签: c++ string

我为一个错误的单词过滤器创建的计数变量有些麻烦。每次检查坏词检查时,我都希望计数增加。我已经尝试了很多方法,但变量仍然没有增加。

我试过它

badCount = badCount + 1;
badCount + 1;
badCount = badCount++;
badCount ++;

但这些方法都不起作用。我不是这是一个简单的灵魂,但经过一段时间我调试我正在寻求一些帮助。

这是我的代码如下。

bool Player::AcceptableChat(const string& p_string) {
    //Old filter.
    //vector<string> vulger = { "fuck", "cunt", "dick", "fanny", "vagina", "bastard", "wanker", "penis", "shithead", "asshole", "bitch", "bollox",
    //"dike", "gay", "lesbian", "fucker", "wank", "masturbate", "tit", "boobs", "bent", "dickhead", "blowjob", "pussy","shit" };

    int badCount = 0;
    vector<string> vulgar;
    ifstream file("filter/Banned.txt");
    string word, temp;
    if (file.is_open()) {
        while (file.good()) {
            getline(file, word);
            vulgar.push_back(word);
        }
    }
    else {
        cout << "Not loaded";
    }
    //Eliminates the user entering curse words for a name.
    for (vector<string>::iterator it = vulgar.begin(); it != vulgar.end(); it++) {
        if ((p_string == *it) || (p_string.find(*it) != std::string::npos)) {
            badCount++;                 
            //Testing what words are been neglected by the if statement.
            string ip = SocketLib::GetIPString(m_connection->GetRemoteAddress());
            USERLOG.Log("Player: " + m_name + "\tBanned Word: " + *it + "\tIp Address: " + ip);
            return false;
        }
    }
    cout << "Bad Count: " << badCount << endl;
    if (badCount == 3) {
        m_connection->Close();
    }
}

当向连接发送字符串时,将调用上面的函数。

if (AcceptableChat(p_string)) {
    Conn()->Protocol().SendString(*Conn(), p_string + newline);
}
else {
    Conn()->Protocol().SendString(*Conn(), "This message is offensive !!!" + newline);
}

3 个答案:

答案 0 :(得分:0)

这里没有显示足够的上下文,但无论如何:

只要badCount不是类成员或静态变量,它的值就永远不会超过1,因为当满足条件时,你将从实际范围返回

for (vector<string>::iterator it = vulgar.begin(); it != vulgar.end(); it++) {
    if ((p_string == *it) || (p_string.find(*it) != std::string::npos)) {
         //Testing what words are been neglected by the if statement.
         string ip = SocketLib::GetIPString(m_connection->GetRemoteAddress());
         USERLOG.Log("Player: " + m_name + "\tBanned Word: " + *it + "\tIp Address: " + ip);
         badCount++;
         return false; // This seems to be cause of your problems
     }

     // This code part is never reached for bad words
     cout << "Bad Count: " << badCount << endl;
     if (badCount == 3) {
         m_connection->Close();
     }
}

你可能想拥有

for (vector<string>::iterator it = vulgar.begin(); it != vulgar.end(); it++) {
    if ((p_string == *it) || (p_string.find(*it) != std::string::npos)) {
         //Testing what words are been neglected by the if statement.
         string ip = SocketLib::GetIPString(m_connection->GetRemoteAddress());
         USERLOG.Log("Player: " + m_name + "\tBanned Word: " + *it + "\tIp Address: " + ip);
         badCount++;
         // moved return false; ...
     }

     cout << "Bad Count: " << badCount << endl;
     if (badCount == 3) {
         m_connection->Close();
         // ... here
         return false;
     }
}

答案 1 :(得分:0)

int badCount = 0;移到您的功能之外。

您的代码似乎想跟踪用户使用的“禁止词”的数量,一旦命中3,您就想要踢它们(删除连接)。为此,您的代码使用局部变量来存储badCount。当您的代码发现第一个坏词时,它会递增此局部变量,然后是EXITS。因此,当您再次扫描用户的输入时,对于找到的第一个坏词,您总是处于1。

badCount移到函数外部会使它在调用之间保持其值。现在,您可以累积用户使用的错误字数。

你可以自己打开一个错误计数累积到多个用户的错误,所以我建议你通过调用函数的引用传入用户的badCount。这将使调用函数控制何时重置badCount,例如每当您开始处理新用户的输入时。

答案 2 :(得分:-1)

如果你点击增量,你的计数器将递增,这是一个事实,它不能被改变。现在你怎么发现它没有增加?我百分百肯定,如果你之前和之后cout badCount,你会看到增量。您应该知道,因为在badCount的唯一赋值之后您有一个返回(badCount超出范围),编译器将对其进行优化(甚至可能使用-O0,因为它很简单),所以{ {1}}在编译的程序中可能根本不存在。

也许您希望badCount成为全局变量?或者至少是静态的,如果你把它保持在本地,你将不会在通话后看到差异。