2015-08-25 1 views
-1

Я пишу программу, помогающую решать кроссворды. Поэтому я получаю слово из текстового списка всех слов на английском языке, делая каждый из них символом символов и сравнивая этот вектор с вектором любых начальных букв, которые у меня есть. Он работает отлично и дает хорошие результаты, но каждый раз, когда я получаю сообщение об ошибке «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/

+0

Одним из первых необходимых навыков программирования является научиться использовать отладчик. Вы выполняете свою программу по строкам и находите, какой фрагмент кода запускает исключение. –

+1

* но выполнение vector.reserve * Это не задает размер вектора. Функция, которую вы хотите, это 'vector :: resize()' – PaulMcKenzie

+0

. Спасибо, я изменил функцию для изменения размера, но даже когда я изменил ее до смешной суммы, она все равно получает ошибку. –

ответ

0

Одна проблема, которую я вижу, что вы не стирая символ вы утверждаете хотите стереть:

listWord.erase(listWord.begin() - 1 + j); 

Это не стирает символ jth в последовательности.

Самый простой пример этого сбоя - если j == 0 в начале цикла и совпадение первого символа.

Просто сделать это вместо того, чтобы:

listWord.erase(listWord.begin() + j); 
+0

Спасибо за помощь, я изменил эту строку на то, что вы предложили. Я не знаю, почему я запутался в индексах ...К сожалению, делать это и изменять размер вектора, а не оставлять его, не помогло избавиться от ошибки. Любые другие идеи? –

+1

Затем, пожалуйста, разместите данные, вызывающие проблему, или скопируйте данные в свой вопрос, чтобы другие могли видеть, с чем вы работаете. – PaulMcKenzie

+0

Извините, я новичок в StackOverflow и до сих пор не совсем уверен в информации, которую мне нужно предоставить. Пример вывод я получаю:/Users/alexray/Библиотеки/кэша/clion11/CMake/генерироваться/74a9f2b2/74a9f2b2/Debug/CrosswordSolver Введите число букв в слове Введите набор букв ОАС АИБСА увы ALBS эля Alls милостыню альпы также шила Gals лабораторий молодцы LAGS Lams Лаосские круги плеть Lass последних законов лежит Leas Pals паруса продажи соли уплотнения плиты шлака захлопывания шлепка ламели слава Slaw умерщвляйте LibC++ abi.dylib: прекращение с неперехваченным исключением типа станда: : length_error: vector Процесс завершен с кодом выхода 6 –

0

Я искал в неправильном месте все время. Я посмотрел на количество слов/строк в файле (109582) и изменил

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; 
     } 
     counter++; 
    } 

в

while (counter < 109582) { 
     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; 
     } 
     counter++; 
    } 

Кажется, я получал какие-то ошибки переполнения при попытке чтения в несколько строк чем были доступны в файле.

Смежные вопросы