Immer Abbruch mit "uncaught exception vom Typ std::length_error: vector" Fehler C++
Ich Schreibe ein Programm zum lösen von Kreuzworträtseln. Also ich bin immer ein Wort aus einem text-Liste aller Wörter in der englischen Sprache, so dass jeder Vektor von chars, und der Vergleich, der Vektor zu einem Vektor von was auch immer beginnen Briefe, die ich habe. Es läuft wunderbar und gibt mir gute Ausgabe, aber jedes mal, wenn ich erhalte eine Fehlermeldung "libc++abi.dylib: Abbruch mit uncaught exception vom Typ std::length_error: vector".
Hier ist mein code:
#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;
}
Vom googeln um, ich dachte, es war eine Frage von meinem vector war anfangs nicht groß genug, um einige der Worte, sondern tun Vektor.reserve(some_number) vor der Zuweisung eines Wertes an die vector nicht helfen nichts. Auch konnte ich mir nicht vorstellen, dass ein Vektor hätte keine Probleme mit <20 Elemente.
Danke für die Hilfe! (Ich bin neu in C++ also wenn es etwas ich sollte natürlich auch anders machen, lass es mich wissen).
Bearbeiten: Die Datei arbeite ich mit der wordsEn.txt Datei von dieser website: http://www-01.sil.org/linguistics/wordlists/english/
- Einer der 1. die wesentlichen Fertigkeiten zu erreichen, die mit der Programmierung ist, zu lernen, wie Sie Ihre debugger. Sie Schritt durch Ihr Programm eine Zeile, und herauszufinden, welcher Teil des Codes löst die Ausnahme.
- aber tun Vektor.reserve, die nicht die Größe des Vektors. Die Funktion, die Sie wollen, ist
vector::resize()
- Danke, ich habe die Funktion zum ändern der Größe, aber selbst wenn ich angepasst, um einen lächerlichen Betrag, es wird immer noch der Fehler.
- Nach den Kommentaren im code, warum Sie denken, es ist ein escape-Zeichen am Ende der Zeichenfolge zu entfernen?
getline(wordList, example); // Get word, put it in example variable
und diesevector2.erase(vector2.end() - 1); // Erase escape character from end of word
? - Mit dem debugger und einem Blick auf die Werte der Elemente im Vektor. Sobald die Zeile in der string-variable und setzen Sie in einen Vektor, wird das Letzte element des Vektors ist ein "\r". Das war einer meiner früheren bugs, die ich hatte, zu beheben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem Problem, das ich sehe ist, dass Sie nicht löschen Sie das Zeichen ein Anspruch, den Sie löschen wollen:
Dies löscht nicht die
jth
Zeichen in der Sequenz.Das einfachste Beispiel für dieses Versagen ist, wenn
j == 0
am Anfang der Schleife, und das erste Zeichen entspricht.Einfach nur dies:
War ich an der falschen Stelle suchen die ganze Zeit. Ich schaute auf die Anzahl der Wörter/Zeilen in der Datei (109582) und verändert die
zu
Es scheint, ich hatte immer irgendeine Art von überlauf-Fehler, indem Sie versuchen zu Lesen Sie in mehr Linien als in der Datei.
while (getline(wordList, example))
. Probieren (3½ Jahre später lol)