[英]Printing string inputs in reverse order
我正在尝试构建一个程序,以相反的顺序输出输入,直到输入单词“ stop”为止。 例如,如果我输入
dog cat monkey
desk chair
burger cheese ham
stop
它应该输出:
burger cheese ham
desk chair
dog cat monkey
到目前为止,我有以下内容:
{
string x, y;
do {
cin >> x;
y = y + x;
} while (x != "stop");
int reverse = y.getNumLines();
while (reverse >= 0) {
cout << y.getLine(reverse) << "\n";
reverse = reverse -1;
}
return 0;
}
它可以正确读取我的输入,但是对于y.getNumlines
和y.getLine
,我得到没有输出的错误。 谁能帮我吗?
为什么不交换您要追加的订单?
#include <iostream>
int main(int argc, const char * argv[])
{
std::string x, y;
while ( (std::getline(std::cin,x)) && x != "stop"){
y = x + "\n" + y; // "" + "foo bar" 2.) "second input" + "foo bar"
}
std::cout<< y;
return 0;
}
Nico的答案可能对您来说是一条更好的途径,但是对于那些喜欢使用更惯用的方法的人,我建议使用行向量,一旦存储起来就可以轻松地向后打印。 第一件事是Line
类,您可以使用它来惯用地读取输入行,而不是停在空格处:
struct Line {
std::string str;
};
std::istream &operator>>(std::istream &in, Line &line) {
std::getline(in, line.str);
if (line.str == "stop") {
in.clear(std::ios::failbit);
}
return in;
}
std::ostream &operator<<(std::ostream &out, const Line &line) {
out << line.str;
return out;
}
Line
需要的只是一个带有实际文本的字符串,我已经添加了对它的输入和输出支持,原因是您接下来将要看到的原因。 注意,输入是通过getline
而不是>>
。 这是Line
类的主要目的。 当输入“停止”时,我也使它失败。 如果没有,它将继续读取直到EOF。
现在,您可以轻松地重用line类,以便根据需要调整输入的形状。 接下来,我们将使用我们刚创建的(或可能已从其他内容中删除的内容):
int main() {
std::istream_iterator<Line> in1(std::cin), in2;
std::vector<Line> inputs(in1, in2);
std::reverse_copy(std::begin(inputs), std::end(inputs), std::ostream_iterator<Line>(std::cout, "\n"));
}
我们要做的第一件事是通过读取输入(使用对Line
的输入支持)形成向量。 当到达文件末尾或输入“停止”时,它将停止,并且每一行输入都将很好地存储在向量中。
接下来,我们调用reverse_copy
将向量(输入的每一行)中的所有内容复制到标准输出中,并以换行符分隔,但是所有操作都向后进行,因此我们以相反的顺序结束每一行。
就是这样! 一旦创建Line
类,获取行输入并将其反转的算法就可以像使用单词一样保持不变,但是切换到行仅需要用Line
替换几个std::string
实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.