if语句中的字符串

时间:2020-09-18 20:44:52

标签: c++ string if-statement

我正在尝试编写一个代码,该代码列出文本文件中使用的所有单词,而无需重复。我成功列出了所有单词,但我总是会重复,如果if语句第17行的值始终为0。我不知道为什么,单词会在向量中正确列出。有什么建议吗?

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

class reading {
public:
    string word;
    vector<string> words;
};

int checkifexist(string word) {
    reading readingobject;
    bool exist = false;
    for (int i = 0; i < readingobject.words.size(); i++) {
        if (word == readingobject.words[i]) {
            exist = true;
            break;
        }
    }

    return exist;
}

int main() {

    reading readingobject;
    ifstream inFile;
    inFile.open("Book.txt");

    if (inFile.fail()) {
        cout << "file didn't open" << endl;
        exit(1);
    }
    readingobject.word.resize(1);
    while (!inFile.eof()) {
        inFile >> readingobject.word;
        if (checkifexist(readingobject.word) == 1)
            continue;

        cout << readingobject.word << endl;
        readingobject.words.push_back(readingobject.word);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

checkifexist()内,您正在创建一个新的reading对象,该对象的words向量为空,因此该循环无用,该函数返回0。 / p>

您需要改为从reading传递main()对象作为输入参数,例如:

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

class reading {
public:
    vector<string> words;
};

bool checkifexist(const reading &readingobject, const string &word)
{
    for (size_t i = 0; i < readingobject.words.size(); ++i) {
        if (word == readingobject.words[i]) {
            return true;
        }
    }
    return false;

    /* alternatively:
    return (std::find(readingobject.words.begin(), readingobject.words.end(), word) != readingobject.words.end());
    */
}

int main()
{
    reading readingobject;
    string word;

    ifstream inFile;
    inFile.open("Book.txt");

    if (!inFile) {
        cout << "file didn't open" << endl;
        return 1;
    }

    while (inFile >> word) {
        if (checkifexist(readingobject, word))
            continue;

        cout << word << endl;
        readingobject.words.push_back(word);
    }

    return 0;
}

或者,当涉及到跟踪唯一元素时,可以使用std::set代替std::vector,例如:

#include <iostream>
#include <fstream>
#include <set>

using namespace std;

class reading {
public:
    set<string> words;
};

int main()
{
    reading readingobject;
    string word;

    ifstream inFile;
    inFile.open("Book.txt");

    if (!inFile) {
        cout << "file didn't open" << endl;
        return 1;
    }

    while (inFile >> word) {
        if (readingobject.words.insert(word).second)
            cout << word << endl;
    }

    return 0;
}
相关问题