当用户输入输入时,如何获得C ++程序来计算单词数?

时间:2012-08-01 17:21:29

标签: c++

我正在尝试编写一个程序,该程序不断地从用户那里获取输入,直到用户输入“quit”。每次用户输入输入时,我希望程序打印出用户输入的单词数。所以用户的以下输入:

hello how are you

将产生以下输出:

You entered 4 words.

但是,我在编写程序时遇到问题,因此只计算一行中的字数;在进入下一行之前,它不会清除数字。因此,如果它从用户那里获取了三次输入,则会将这三行中的单词总数相加。例如,以下输入:

how are you
i am good thank you
quit

将产生以下输出:

 You entered 9 words.

当我希望它输出用户输入的每一行后的字数(退出除外),即

>>how are you
<<You entered 3 words.
>>i am good thank you
<<You entered 5 words.
>>quit

这是我的代码的相关部分:

char *input;
int inum;

int inputLoop()
{
    char quit[] = "quit";
    inum = 0; //counts number of words

    while (strcmp(input, quit) != 0)
    {
         cin >> input;
         inum++;
    }
    cout <<"You entered " <<inum <<" words." <<endl;

我宁愿不使用像矢量这样的东西;我使用的任何东西都需要最终转换为* char,因为我的全局变量是* char。 (我的全局变量是* char,因为根据某些条件,*输入可以从main设置为* argv []。)

我已经尝试了各种各样的东西,但我似乎无法理解strcmp(输入,退出)一次比较输入的一个单词以退出而不是将整个输入行与放弃。 HELP。

4 个答案:

答案 0 :(得分:5)

您的任何要求均未排除std::stringstd::vector的使用。我建议你使用它们。

#include <string>
#include <sstream>
#include <iostream>
#include <vector>

std::vector<std::string> words;

int inputLoop()
{
    char quit[] = "quit";
    total_words = 0;

    std::string line;
    // grab a line at a time
    while(std::getline(std::cin, line) && line != quit) {
        // clear the vector of words
        words.clear();
        // make a string stream to read words from that line
        std::stringstream ss(line);
        // grab all the words into a vector
        std::string word;
        while(ss >> word) {
             words.push_back(word);
        }
        std::cout <<"You entered " <<words.size() <<" words." <<endl;
    }
}

int main(int argc, char** argv) {
    // get the data from argv
    words = std::vector<std::string>(argv, argv + argc);
}

答案 1 :(得分:1)

您应该使用getline()将整行输入放入某个缓冲区。然后,处理输入缓冲区以计算其中的字数。假设您将每个单词定义为由空格分隔的字符块。我自己,我是strtok()粉丝打破缓冲区。

答案 2 :(得分:0)

另一种方法,只是为了好玩:

#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    unsigned num = 0;
    std::for_each(
        std::istream_iterator<std::string>(std::cin),
        std::istream_iterator<std::string>(),

        [&num](const std::string& s)
        {
            if (s == "quit")
                std::cin.setstate(std::ios::eofbit);
            ++num;
            if (std::cin.peek() == '\n') {
                std::cout << "You entered "
                          << num
                          << " word"
                          << ((num == 1) ? "." : "s.")
                          << '\n';
                num = 0;
            }
        });
}

不会通过将行标记为向量来浪费资源:)

答案 3 :(得分:0)

我会叫距离

#include <string>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <sstream>

int main()
{
    std::string line;
    while(std::getline(std::cin, line) && line != "quit")
    {
        std::stringstream  linestream(line);
        std::cout << "You entered "
                  << std::distance(std::istream_iterator<std::string>(linestream), 
                                   std::istream_iterator<std::string>())
                  << " words\n";
    }
}