调试断言在 Visual Studio 2019 "string subscript out of range" C++中失败



我正在用c++制作一款游戏,我希望它能够在程序上成功地创建一个自己的宇宙,然而,我在生成星系时遇到了一个断言错误。我有一个Stars类,构造函数有以下参数:

Stars(std::string newStarName = WordGenerator(), double starPicker = std::rand() % 100, int newStarPosX = std::rand() % 500, int newStarPosY = std::rand() % 500)

我也有一个函数可以随机创建星星:

void GenerateStar(std::string newStarName, double starPicker, int newStarPosX, int newStarPosY) {
Stars newStar(newStarName,  starPicker,  newStarPosX,  newStarPosY);
//allStars.push_back(newStar);
allStarsNames.push_back(newStar.starName);}

Galaxy类的构造函数如下:

Galaxy() {
int starCounter = 0;
while (starCounter < 5) {
GenerateStar(WordGenerator(), std::rand() % 100, std::rand() % 500, std::rand() % 500);
starCounter++;
}



}

当我在main visual studio中初始化星系后尝试运行程序时,会出现错误屏幕。错误框

我已经尝试改变默认参数,改变GenerateStar函数的参数,并改变了在Galaxy构造函数中传递给函数调用的参数,但似乎没有任何工作。

WordGenerator函数的定义:

std::string WordGenerator() {
std::vector<char> alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
std::string word;
int counter = 2 + std::rand() % 5;
while (counter > 0) {
word = word + alphabet[std::rand() % alphabet.size()];
counter--;
}
for (int i = 0; i < word.size(); i++) {
if (CohrnceAnalyzer(word[i], word[i + 1]) == true) {
word[i+1] = alphabet[std::rand() % alphabet.size()];
}
}
return word;}

对于Coherence Analyzer功能:

bool CohrnceAnalyzer(char firstLetter, char secondLetter) {
std::vector<char> alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
std::vector<char> firstLetters = { 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'd','d', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'f', 'f' };
std::vector<char> secondLetters = { 'd', 'f', 'g', 'm', 'n', 'p', 'q', 'x', 'b', 'g', 'j', 'm', 'n', 'v', 'w', 'b', 'c', 'd', 'f', 'g', 'm', 'n', 'p', 'q', 'x', 'b', 'j'};
for (int i = 0; i < firstLetters.size(); i++) {
if (firstLetter == firstLetters[i] && secondLetter == secondLetters[i]) {

return true;
}
else {
return false;
}}}

好,这里是字符串下标错误

for (int i = 0; i < word.size(); i++) {
if (CohrnceAnalyzer(word[i], word[i + 1]) == true) {
word[i+1] = alphabet[std::rand() % alphabet.size()];
}
}

i==word.size() - 1时,则i + 1==word.size(),因此word[i+1]是字符串下标错误。

如果您将i < word.size();更改为i + 1 < word.size();,则错误会消失,我认为这也与您在该函数中试图做的事情有意义。但这真的只有你能决定。

相关内容

最新更新