当尝试编译下面的代码时,我得到三个错误。
我对C ++很陌生,并且多次更改代码片段但是没有任何帮助。任何有助于解密这些错误消息的帮助都非常感谢。
#include "../../std_lib_facilities.h"
class Puzzle {
public:
vector<char> letters;
Puzzle(int my_size);
void generate(void);
void enter_letters(void);
void feedback(Puzzle puzzle);
private:
int size = 4;
};
Puzzle::Puzzle(int my_size)
{
size = my_size;
}
//Generate size unique letters for the letters array.
void Puzzle::generate(void)
{
for (int i = 0; i < size; ++i) {
char rand = randint(26) - 1 + 'a';
while ((find(letters[0], letters[size], rand) != letters[size])) {
rand = randint(26) - 1 + 'a';
}
letters[i] = rand;
}
}
//Let the user enter size unique letters.
void Puzzle::enter_letters(void)
{
cout << "Enter four different letters seperated by spaces:\n";
for (int i = 0; i < size; ++i) {
char letter;
cin >> letter;
letters[i] = letter;
}
}
//Tell the user how many bulls and cows they got.
void Puzzle::feedback(Puzzle puzzle)
{
int cows = 0, bulls = 0;
for (int i = 0; i < size; i++) { //input
for (int j = 0; j < size; ++j) { //puzzle
if (i == j && letters[i] == puzzle.letters[j]) {
++bulls;
break;
}
else if (letters[i] == puzzle.letters[j]) {
++cows;
break;
}
}
}
cout << "Bulls: " << bulls << "\nCows: " << cows << "\n";
}
//Seed the random function.
void seed(void)
{
int sum = 0;
cout << "Enter a random string of characters:\n";
string str;
cin >> str;
for (char& c : str)
sum += c;
srand(sum);
}
int main()
{
constexpr int GAME_SIZE = 4;
seed();
Puzzle puzzle(GAME_SIZE);
puzzle.generate();
Puzzle input(GAME_SIZE);
input.enter_letters();
while (puzzle.letters != input.letters) {
input.feedback(puzzle);
input.enter_letters();
}
cout << "Congragulations, you did it!\n";
keep_window_open();
return 0;
}
答案 0 :(得分:0)
您正在使用find()
错误。
find(letters[0], letters[size], rand)
您的letters
是std::vector
。您将向量中的第一个值和向量中的最后一个值传递给std::find
。
这实际上是未定义的行为,因为size
并不总是letters
向量的实际大小。所以,除了你的编译错误之外,你还会得到一个随机的崩溃,作为额外的奖励。
std::find
are iterators of a sequence to search的前两个参数,而不是值。
这应该是:
find(letters.begin(), letters.end(), rand)
此外,您的整体算法已被破坏。一旦letters
达到一定的大小,您的随机数生成代码将花费大量时间来查找要添加到letters
的新字母,而这些字母尚未使用。一旦letters
设法获得字母表中的所有26个字符,这将变成无限循环。但这将是一个不同的问题......