以相反顺序打印字符串输入

时间:2013-01-09 06:42:12

标签: c++ string getline output

我正在尝试构建一个程序,它以相反的顺序输出输入,直到输入“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.getNumlinesy.getLine,我收到错误而没有输出。 任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

为什么不换掉你要追加的订单?

#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;
}

答案 1 :(得分:2)

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。

现在,您可以轻松地重复使用行类,以便根据需要对输入进行整形。接下来,我们将使用我们刚创建的内容(或者可能已经从其他内容中删除):

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类生成,获取行输入和反转它们的算法可以保持不变,就像我们使用单词一样,但切换到行只需要替换{{1}的几个实例与std::string