为什么我的应用程序崩溃了?我的代码出了什么问题?

时间:2016-12-02 21:07:25

标签: c++ arrays crash

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。

2 个答案:

答案 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

Here's an online demo