Я пишу программу, помогающую решать кроссворды. Поэтому я получаю слово из текстового списка всех слов на английском языке, делая каждый из них символом символов и сравнивая этот вектор с вектором любых начальных букв, которые у меня есть. Он работает отлично и дает хорошие результаты, но каждый раз, когда я получаю сообщение об ошибке «libC++ abi.dylib: завершение с неперехваченным исключением типа std :: length_error: vector».Получение «завершение с неперехваченным исключением типа std :: length_error: vector» error C++
Вот мой код:
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#include <iterator>
using namespace std;
string getLetters() {
string word; // Get user letter, put in variable word
cout << "Enter a set of letters" << endl;
cin >> word;
return word;
}
int getLengthOfWord() {
int length; // Get length of word
cout << "Enter the number of letters in the word" << endl;
cin >> length;
return length;
}
// Change strings to vectors of chars
vector<char> stringToVector(string word) {
std::vector<char> v(word.begin(), word.end());
return v;
}
bool compareVectors(vector<char> userWord, vector<char> listWord, int length) {
if (listWord.size() != length) // Make sure the word from the list is the right length
{
return false;
}
int counter = 0; // Counter
for (int i = 0; i < userWord.size(); i++) { // Iterating through the two words
for (int j = 0; j < listWord.size(); j++) {
if (listWord[j] == userWord[i]) { // If the letters match
listWord.erase(listWord.begin() - 1 + j); // Erase the letter from the word
counter++; // Increase counter
break; // Break out of for loop
}
}
}
if (counter == userWord.size()) { // If there were as many matches as letters in user set
return true;
}
else {
return false;
}
}
int main() {
string example; // variable to put words
ifstream wordList; // New ifstream object
wordList.open("/Users/alexray/Dropbox/C++ Practice/WordJumbleSolver/wordsEn.txt"); //open word list
int length = getLengthOfWord(); // Get user input
string word = getLetters();
vector<char> vector1(stringToVector(word));
while (wordList.is_open()) {
getline(wordList, example); // Get word, put it in example variable
vector<char> vector2(stringToVector(example)); // Make word from list a vector
vector2.erase(vector2.end() - 1); // Erase escape character from end of word
if(compareVectors(vector1, vector2, length)) { // compare the vectors
cout << example << endl;
}
}
wordList.close(); // Close stream
return 0;
}
От вокруг прибегая к помощи, я думал, что это был вопрос моего вектора не был изначально достаточно большой, чтобы справиться с некоторыми из слов, но делать vector.reserve (some_number) до присвоения значения вектору ничего не помогло. Кроме того, я не мог себе представить, что у вектора возникнут проблемы с 44 элементами.
Спасибо за помощь! (Я новичок в C++, поэтому, если есть что-то, что я должен делать по-другому, дайте мне знать).
Edit: Файл Я работаю с это файл wordsEn.txt с этого сайта: http://www-01.sil.org/linguistics/wordlists/english/
Одним из первых необходимых навыков программирования является научиться использовать отладчик. Вы выполняете свою программу по строкам и находите, какой фрагмент кода запускает исключение. –
* но выполнение vector.reserve * Это не задает размер вектора. Функция, которую вы хотите, это 'vector :: resize()' – PaulMcKenzie
. Спасибо, я изменил функцию для изменения размера, но даже когда я изменил ее до смешной суммы, она все равно получает ошибку. –