1

我正在尝试编写一个程序,该程序一直接收用户的输入,直到用户输入“退出”。每次用户输入时,我希望程序打印出用户输入的字数。因此,用户的以下输入:

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,因为根据某些条件,*input 可能会从 main 设置为 *argv[]。)

我已经尝试了各种各样的事情,但我似乎无法克服这样一个事实,即 strcmp(input, quit) 一次比较输入的一个单词以退出,而不是比较整个输入行以退出。帮助。

4

4 回答 4

5

您的任何要求都不排除使用std::stringand std::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);
}
于 2012-08-01T17:31:21.697 回答
1

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

于 2012-08-01T17:29:00.930 回答
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;
            }
        });
}

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

于 2012-08-01T18:22:35.743 回答
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";
    }
}
于 2012-08-01T18:29:58.340 回答