如何计算字符串和输出行中出现的唯一单词? C ++

时间:2014-03-08 04:32:17

标签: c++ string

所以我正在做这个家庭作业,我真的遇到了麻烦。我应该计算超过两个字符(必须包含一个字母)的单词数,唯一单词以及每个唯一单词出现在编程执行环境中的次数。我也应该在PEE中输入搜索并输出它出现的次数和它出现的行。我有一些工作,但我真的很难计算每个单词出现的次数。我知道我的代码现在非常糟糕,但这就是我在这里的原因。出于某种原因,我真的很难用这些字符串函数。任何帮助真的很感激!

#include <iostream>
#include <cstring>
#include <string>
#include <cctype>
#include <algorithm>
#include <vector>
#include <set>

using namespace std;

//PEE string
string envstr("");

bool checkChar(unsigned c)
{
    return (ispunct(c) || isspace(c) || isblank(c) || isdigit(c) || c == '\n');
}

void searchWord(unsigned c, size_t length)
{
    multiset<string> words;
    vector<string> vwrds; //this was something i was trying out
    string tempword;
    while (!checkChar(envstr[c]) && c < length)
    {
        tempword = tempword + envstr[c]; //problem here
        c++;
    }

    tempword = tempword + " ";
    vwrds.push_back(tempword); 

    words.insert(tempword); //this is just a bunch of random letters

    tempword.clear();
    //for (multiset<string>::const_iterator i(words.begin()), end(words.end()); i != end; i++)
        //cout << *i;
}

bool checkIfWord(char c)
{
    bool valid = false;
    int i;

        for (i = c; i > c - 2; i--)
        {
            if (!checkChar(envstr[i]))
                valid = true;
        }

        if (valid)
            searchWord(i, envstr.length());

    return valid;
}

int main()
{
    //this code given by my instructor
    extern char **environ; // needed to access your execution environment

    int k = 0;
    size_t wordCount = 0;
    while (environ[k] != NULL)
    {
        cout << environ[k] << endl;     
        string str(environ[k]);
        envstr = envstr + str;
        k++;
    }

    //iterator to count words
    wordCount = count_if(envstr.begin(), envstr.end(), checkIfWord);

    cout << "\nThe PEE contains " << wordCount << " words. \n";

    //transform environment string to lowercase
    transform(envstr.begin(), envstr.end(), envstr.begin(), tolower);

    string input;

    do
    {
        cout << "Enter your search item: \n";
        cin >> input;
        //string can only be forty characters
        if (input.length() > 40 || input == "\n")
        {
            cout << "That search query is too long. \n";
            continue;
        }

        //change the search string to lowercase, like the envstr
        transform(input.begin(), input.end(), input.begin(), tolower);

        int j = 0;
        int searchCount = 0;
        vector<size_t> positions;
        size_t pos = envstr.find(input, 0);

        //search for that string
        while (pos != string::npos)
        {
            positions.push_back(pos);
            pos = envstr.find(input, pos + 1);
            searchCount++;
        }

        cout << "\nThat phrase occurs a total of " << searchCount << " times.\n";
        cout << "It occurs in the following lines: \n";
        //output where that string occurs
        for (vector<size_t>::iterator it = positions.begin(); it != positions.end(); ++it)
        {
            for (int i = *it; i < envstr.length() - 1 && checkChar(envstr[i]); i++)
            {
                cout << envstr[i];
            }

            cout << endl;
        }

        positions.clear();

    } while (input != "END");

    cin.get();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

首先,当参数为char时,函数checkChar()返回false,因此如果要打印出该字符串的位置,则应为:

for (int i = *it; (i < envstr.length() - 1) && !checkChar(envstr[i]); i++)
{
    cout << envstr[i];
}

其次,计算单词的代码没有意义,这里有一个潜在的越界:if (!checkChar(envstr[i])),我建议你使用分隔符'\'分割字符串,然后做一些事情。< / p>