Zeyad Yasser
Zeyad Yasser

Reputation: 1

beginner :While loop not working as it should

I am still a beginner and I am learning from a book. There was a drill that asked me filter input based on a vector of filtered words and if it was one of them it outputs "bad word"

Here is the drill exactly as in the book.

Try This
Write a program that “bleeps” out words that you don’t like; that is, you read in words using cin and print them again on cout. If a word is among a few you have defined, you write out BLEEP instead of that word. Start with one “disliked word” such as string disliked = “Broccoli” When that works, add a few more.;

Here is the code I wrote:

#include <D:\std_lib_facilities.h>

int main()
{

    // RL: omitting actual "bad" words to protect the innocent...
    vector <string> bwords { "word1", "word2", "word3" };

    vector <string> words;
    string input = "";

    while(cin >> input)
    {
        words.push_back(input);
    }

    double counter1 = 0;
    double counter2 = 0;

    while(counter1 < bwords.size() && counter2 < words.size())
    {
        if(bwords[counter1] == words[counter2])
        {
            cout << " bad word ";
        }
        else if (counter1 == bwords.size() - 1 && counter2 != words.size() )
        {
            cout << " "<< words[counter2] <<" ";
            counter1 = 0;
        }
        else
        {
            ++counter1;
            counter2 += 1 / bwords.size();
        }
    }
}

whenever it starts it just tests the first word and repeats its self as if just tests the first if condition.

Upvotes: 0

Views: 200

Answers (1)

Remy Lebeau
Remy Lebeau

Reputation: 595632

You over-complicated your loop. Try something more like this instead:

#include <vector>
#include <string>
#include <algorithm>

using namespace std;

// RL: omitting actual "bad" words to protect the innocent...
const vector <string> bwords { "word1", "word2", "word3" };

string bleepWordIfBad(const string &word)
{
    if (std::find(bwords.begin(), bwords.end(), word) != bwords.end())
        return "BLEEP";
    else
        return word;
}

int main()
{    
    vector <string> words;
    string input;

    while (cin >> input)
        words.push_back(input);

    for (int counter = 0; counter < words.size(); ++counter)
        cout << " " << bleepWordIfBad(words[counter]) << " ";

    /*
    Alternatively:

    for (vector<string>::iterator iter = words.begin(); iter != words.end(); ++iter)
        cout << " " << bleepWordIfBad(*iter) << " ";
    */

    /*
    Alternatively:

    for (const string &word : words)
        cout << " " << bleepWordIfBad(word) << " ";
    */

    return 0;
}

Or, get rid of the manual loop altogether:

#include <vector>
#include <string>
#include <algorithm>

using namespace std;

// RL: omitting actual "bad" words to protect the innocent...
const vector <string> bwords { "word1", "word2", "word3" };

string bleepWordIfBad(const string &word)
{
    if (std::find(bwords.begin(), bwords.end(), word) != bwords.end())
        return "BLEEP";
    else
        return word;
}

void outputWord(const string &word)
{
    cout << " " << bleepWordIfBad(word) << " ";
}

int main()
{    
    vector <string> words;
    string input;

    while (cin >> input)
        words.push_back(input);

    for_each(words.begin(), words.end(), outputWord);

    /*
    Alternatively:

    for_each(words.begin(), words.end(),
        [](const string &word) { cout << " " << bleepWordIfBad(word) << " "; }
    );
    */

    return 0;
}

Or, get rid of the input vector altogether and just filter the user's input as it is being entered:

#include <vector>
#include <string>
#include <algorithm>

using namespace std;

// RL: omitting actual "bad" words to protect the innocent...
const vector <string> bwords { "word1", "word2", "word3" };

string bleepWordIfBad(const string &word)
{
    if (std::find(bwords.begin(), bwords.end(), word) != bwords.end())
        return "BLEEP";
    else
        return word;
}

int main()
{    
    string word;

    while (cin >> word)
        cout << " " << bleepWordIfBad(word) << " ";

    return 0;
}

Upvotes: 2

Related Questions