否则,即使逻辑似乎是正确的,似乎也没有工作

时间:2016-01-17 03:53:41

标签: c++ loops if-statement vector nested

所以我发现自己在尝试制作解决此练习的程序时陷入困境:

  

编写一个程序,“淹没”你不喜欢的单词;那是,   你用cin阅读单词并在cout上再次打印它们。如果一个词是   在你定义的几个中,你写出了BLEEP而不是那个   字。

我尝试使用嵌套for循环确实正常工作,问题似乎与else if

 int main() {
    std::vector<std::string> disliked = { "fuck", "cunt", "bitch", "motherfucker", "shit"};
    std::vector<std::string> input;
    for (std::string forInput; std::cin >> forInput;) {
        input.push_back(forInput);
    }

    for (int i = 0; i < input.size(); ++i) {
        for (int x = 0; x < disliked.size(); ++x) {
            if (input[i] == disliked[x]) {
                std::cout << "*beep*\n";
                x = disliked.size();
            }
            else if (x == (input.size()) && input[i] != disliked[x]) {
                std::cout << input[i] << std::endl;
            }
        }
    }
    std::cin.ignore();
    std::cin.get();
    return 0;
}

这部分

else if (x == (input.size()) && input[i] != disliked[x]) {
                std::cout << input[i] << std::endl;
            }

很可能是困扰我的东西,但它的逻辑似乎是正确的。 如果第一个&#34;如果&#34;是假的然后它会转到下一个,&#34;否则如果&#34;,如果两个&#34;否则如果&#34;参数是真的然后它应该输出我想要的,但它不起作用。

我真的很感激一些帮助和解释。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

else if (x == (input.size()) && input[i] != disliked[x])

我不确定我是否理解您正在尝试使用该测试,但似乎它不会执行与您的任务相关的任何操作。为什么要将x(这是顽皮单词列表的索引)与输入数据的大小进行比较?也许你打算做这样的事情:

else if (x == (disliked.size() - 1))

那将检查你是否在不喜欢列表的最后一个单词,在这种情况下,可以假设输入单词不在其上。

就我个人而言,我认为如果将输出与测试循环分开并使用bool来确定要打印的内容会更清晰。像这样:

for (int i = 0; i < input.size(); ++i) {
    bool is_naughty = false;
    for (int x = 0; x < disliked.size(); ++x) {
        if (input[i] == disliked[x]) {
            is_naughty = true;
            break;
        }
    }

    if (is_naughty)
        std::cout << "*beep*\n";
    else
        std::cout << input[i] << std::endl;
}

答案 1 :(得分:0)

你是否有理由将矢量用于不喜欢的字符串?看起来像一个集合将更适合这样的事情:

std::set<string> disliked;

要查明您的单词是否在不受欢迎的集合中,请使用:

if (disliked.find(input[i]) == disliked.end()) {
   // Word not in disliked set 
} else { 
   // Word is in disliked set
}