我是第一次学习我的第一门编程语言--C ++ - 来自Bjarne Stroustrup的书"编程原理和练习使用C ++"。第4章讨论向量。在我完成之前解释的所有内容和代码将始终正常工作,直到现在。
我写的代码根本不起作用。下面的代码是为了少量练习而制作的,其中读入输入并输出单词,将不喜欢的单词清除。
#include "std_lib_facilities.h"
int main() {
vector<string>text;
string disliked = "cat";
for (string word; cin >> word;) {
text.push_back(word);
}
for (int a = 0; a < text.size(); ++a) {
if (text[a] != disliked) {
cout << text[a] << endl;
}
else {
cout << "BLEEP\n";
}
}
keep_window_open();
}
我的第一个想法是为不喜欢的单词创建另一个向量vector<string>disliked ={"cat", ...}
,但是if (text[x] != disliked)
似乎不是一种比较每个向量的元素的方法(至少它是警告我关于运算符和操作数不匹配)。有办法吗?
但回到代码中:通过一些修改,输入中没有任何不喜欢的单词,程序有时会运行。我仍然无法达到主要目的。也许,实际的错误在于输入终止。 Ctrl + Z不适合我,但只输入一个字符。不知怎的,Ctrl + C碰巧正常工作(如果没有不喜欢的话)。
所以这里有实际的问题:
代码是否正确? (因为我可以自己检查,而我可能一直在不正确地终止输入)
考虑到Ctrl + Z只为输入添加了一个字符,我如何以其他方式终止输入?
有没有办法通过比较&#34;输入&#34;来使这个程序工作?矢量与&#34;不喜欢&#34;矢量?
答案 0 :(得分:0)
我猜你有两个选择:
<强> 1。从文本文件中获取输入。
在这种情况下,您必须将数据放在项目目录中的文本文件中。例如,在下面发布的代码中,“text.txt”是应该存储输入的位置(您的单词)。
次要评论: 我不确定“std_lib_facilities.h”包含什么,所以我添加了一些标准头文件来为我编译代码。
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
int main()
{
std::vector<std::string> texts;
std::string dislikedWord = "cat";
std::ifstream fin("text.txt");
for (std::string word; fin >> word;)
texts.push_back(word);
unsigned textsCount = texts.size();
for (unsigned textIndex = 0; textIndex < textsCount; ++textIndex)
if (texts[textIndex] != dislikedWord)
std::cout << texts[textIndex] << '\n';
else
std::cout << "BLEEP\n";
return 0;
}
<强> 2。继续阅读单词,直到最终满足条件。
在这种情况下(如果您不想从文本文件中读取),您应该插入一个使程序停止输入的条件,这样您就可以更进一步。条件可以是可以读取的最大字数或某些“特殊”字。在下面的例子中,我选择以10个单词结束阅读。
次要评论:也许您参加练习的章节会告诉您要插入的条件。我怀疑你必须使用CTRL + C或任何其他组合来解决这个问题。
#include <iostream>
#include <vector>
#include <string>
int main()
{
const unsigned totalWords = 10;
std::vector<std::string> texts;
std::string dislikedWord = "cat";
for (std::string word; std::cin >> word;) {
texts.push_back(word);
if (texts.size() == totalWords) // could've put it in the for condition
break; // terminates the for-loop
}
unsigned textsCount = texts.size();
for (unsigned textIndex = 0; textIndex < textsCount; ++textIndex)
if (texts[textIndex] != dislikedWord)
std::cout << texts[textIndex] << '\n';
else
std::cout << "BLEEP\n";
return 0;
}
答案 1 :(得分:0)
代码是否正确? (因为我不能自己检查,因为我可能一直在不正确地终止输入)
似乎适合我。
考虑到Ctrl + Z只为输入添加了一个字符,我怎么能以其他方式终止输入?
我使用Ctrl-D
标记行尾。
有没有办法通过比较“输入”向量和“不喜欢”向量来使这个程序工作?
通常在比较类型(使用==
和!=
)时,它们具有相同的类型(或者编译器可以将一种类型转换为与另一种类型相同的类型(但这是迂腐的类型) ;对于初学者,最好考虑比较相同类型的对象))。
vector<string> text;
string disliked = "cat";
// STUFF
if (text[x] != disliked) // disliked is a string
// text[x] is a string (because we are accessing the `x` element.
如果我们改变不喜欢矢量:
vector<string> text;
vector<string> disliked = "cat";
// STUFF
if (text[x] != disliked) // disliked is a vector<string>
// text[x] is a string
由于类型不匹配,因此难以比较。所以你需要遍历所有不喜欢的元素,看看你是否能找到这个词。
bool found = false;
for(std::size_t loop = 0; loop < disliked.size(); ++loop) {
if (text[x] == disliked[loop) { // Types are the same here.
found = true;
break;
}
}
if (!found) {
有一些技术可以使上述紧凑。如果你刚刚开始,这可能有点早,但为了完整性,我将在这里添加:
bool found = std::find(std::begin(disliked), std::end(disliked), text[x]) != std::end(disliked);
if (!found) {