1

ユーザーが「終了」と入力するまで、ユーザーからの入力を受け取り続けるプログラムを作成しようとしています。ユーザーが入力を入力するたびに、ユーザーが入力した単語数をプログラムに出力させたい。したがって、ユーザー側の次の入力:

hello how are you

次の出力が生成されます。

You entered 4 words.

しかし、1行の単語数をカウントするようにプログラムを作成するのに問題があります。次の行に進む前に番号をクリアしません。したがって、ユーザーからの入力を3回受け取った場合、それらの3行の単語の総数が合計されます。たとえば、次の入力:

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に変換する必要があります。(そして、特定の条件によっては、*inputがmainから*argv []に設定される可能性があるため、私のグローバル変数は* charです。)

私はいろいろなことを試しましたが、strcmp(input、quit)が入力行全体を比較して終了するのではなく、一度に1つの入力の単語を比較して終了するという事実を乗り越えることができないようです。ヘルプ。

4

4 に答える 4

5

std::stringおよびの使用を妨げる要件はありません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 <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 に答える
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 に答える