char* szWords[] = { "caralho", "porra" };
if (IsGoldGrade(pObj)) //Ignore, its ok. //Crashing after i added the
{
for (int x = 0; x < sizeof(szWords); x++) {
if (strstr((strlwr((char*)szWords[x])), szChat)) {
char szBuffer[256];
sprintf(szBuffer, "You can't type %s", szWords[x]);
Announce(pObj, szBuffer);
memset(szBuffer, 0, 256);
return;
}
}
}
Idk但我无法将其用作&#34;代码&#34;在stackoverflow上。
Pastebin:http://pastebin.com/u8yit8Rw
PS:我不能使用StrStrI,因为我正在使用Visual Studio 2003。
答案 0 :(得分:1)
您的for
循环条件错误。你想迭代指向char的指针数组
您的循环for (int x = 0; x < sizeof(szWords); x++)
会在x < sizeof(szWords)
期间继续。但是sizeof(szWords)
不是数组长度。它只是说你的数组在内存中占用了多少字节。它是依赖于系统的,但它是指向char的指针大小的两倍,因此可能是8或16个字节。您需要将此大小除以数组元素的大小,然后您将获得正确的数组大小。
像这样重写你的for
循环:
for (int x = 0; x < sizeof(szWords)/sizeof(szWords[0]); x++)
或者如果您的编译器支持C ++ 11,您可以尝试基于范围:
for (const char *word : szWords)
除此之外,如果你正在编写C ++代码,你真的应该使用STL和其他C ++特性。例如,您的字符串数组应声明为:
std::vector<std::string> words = { "caralho", "porra" };
或者你的编译器不支持C ++ 11(然后真的改变它......)
std::vector<std::string> words;
words.push_back("caralho");
words.push_back("porra");
for (std::size_t i = 0; i < words.size(); ++i) {
// since you are using C string functions you will need word as C string
const char *word = words[i].c_str();
// do whatever you want with word
}
在编写代码之前,还要考虑阅读现代C ++书籍。
答案 1 :(得分:1)
从它的外观来看,这是一个检查用户是否写了禁止词的功能?
我将char* szWords[]...
替换为std::vector<std::string>
以存储被禁止的字词,并使用std::find
查看输入是否在该列表中。
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
std::vector<std::string> bannedWords{"hamster", "elderberries", "etcetera"};
bool isBanned(const std::string &str) {
return std::find(bannedWords.begin(), bannedWords.end(), str) != bannedWords.end();
}
int main() {
std::cout << "Is 'wally' banned? " << isBanned("wally") << std::endl;
std::cout << "Is 'elderberries' banned? " << isBanned("elderberries") << std::endl;
}
有关std::find
的更多信息,请here。