我为一个错误的单词过滤器创建的计数变量有些麻烦。每次检查坏词检查时,我都希望计数增加。我已经尝试了很多方法,但变量仍然没有增加。
我试过它
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);
}
答案 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
成为全局变量?或者至少是静态的,如果你把它保持在本地,你将不会在通话后看到差异。