0

何らかの理由で、このコードはリスト内のすべての単語を出力していますが、z が 3 つ以上ある単語だけを出力したいのです

「zz」を含む単語の検索の下で、バズやブリザードの例のコードを解決することができました。私の主な目標は、単語全体で 3 つの z が含まれる単語を検索することです。頭のてっぺんから外れた例としては、zblizzard などがあります。

Word* Dictionary::findzs()
{
    int wordIndex = 0;
    cout << "List : " << endl;
    while (wordIndex < MAX_WORDS) {
        string word1 = myWords[wordIndex]->word;
        wordIndex++;
        if (word1.find("zz") != std::string::npos){
            cout << word1 << endl;
        }
    }
    return 0;
}

アップデート:

bool has_3_zs(const std::string& s)
{
    return std::count(std::begin(s), std::end(s), 'z') >= 3;
}

void Dictionary::has3zs()
{
    int wordIndex = 0;
    string word = myWords[wordIndex]->word;
    while (wordIndex < MAX_WORDS) {
        for (auto& s : { word })
        {
            if (has_3_zs(s))
            {
                std::cout << s << '\n';
            }
        }
    }
    }
4

3 に答える 3

3

わかった。少なくとも 3 文字を含む文字列を任意の場所に一致させたい'z'

を使用しstd::countます。この例:

#include <algorithm> // std::count
#include <iostream>  // std::cout
#include <iterator>  // std::begin, std::end
#include <string>    // std::string

// This is the function you care about.
// It returns `true` if the string has at least 3 'z's.
bool has_3_zs (const std::string& s)
{
    return std::count(std::begin(s), std::end(s), 'z') >= 3;
}

// This is just a test case. Ignore the way I write my loop.
int main()
{
    for (auto& s : {"Hello", "zWorzldz", "Another", "zStzzring"} )
    {
        if (has_3_zs(s))
        {
            std::cout << s << '\n';
        }
    }
}

プリント:

zWorzldz
zStzzring

編集

わかりました、私はあなたの例にもう少し似た例を書きました。私のループは、あなたのものとほぼ同じように書かれています (私の意見では、これは最善ではありませんが、これ以上混乱を招きたくありません)。

// This is the function you care about.
// It returns `true` if the string has at least 3 'z's.
bool has_3_zs (const std::string& s)
{
    return std::count(std::begin(s), std::end(s), 'z') >= 3;
}

struct SomeTypeWithAWord
{
    std::string word; // The bit you care about

    // Allow me to easily make these for my example
    SomeTypeWithAWord(char const * c) : word(c) {}
};

// This will contain the words.
// Don't worry about how I fill it up,
// I've just written it the shortest way I know how.
std::vector<SomeTypeWithAWord> myWords
                                {"Hello", "zWorzldz", "Another", "zStzzring"};

// This is the function you are trying to write.
// It loops over `myWords` and prints any with 3 or more 'z's.
void findzs()
{
    std::cout << "List : \n";
    std::vector<SomeTypeWithAWord>::size_type wordIndex = 0;
    while (wordIndex < myWords.size()) // Loop over all the words
    {
        const std::string& testWord = myWords[wordIndex].word;
        if (has_3_zs(testWord)) // Test each individual word
        {
            std::cout << testWord << '\n'; // Print it
        }
        ++wordIndex;
    }
}

int main()
{
    findzs();
}
于 2013-09-23T10:30:33.213 に答える