2013-01-09 165 views
0

我正在尝试构建一个程序,该程序以相反顺序输出输入,直到输入“停止”字样。 例如,如果我进入以相反的顺序打印字符串输入

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,我得到没有输出的错误。 任何人都可以帮我吗?

+1

'y'不是简单的'矢量'吗?你知道这两个函数不存在字符串吗? –

+0

抱歉,我还没有矢量图的知识。 – user1940749

+0

它是否必须“停止”?文件结尾往往会更好地处理所有事情。如果你是在要求它的话,记住这一点。 – chris

回答

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; 
} 
+0

这将输出“停止”。一个简单的解决方法是while((std :: cin >> x)&& x!=“stop”)'。另一个问题是它需要在新行上打印,这需要以最简单的形式“std :: getline”。 – chris

+0

只是指出了添加中的逻辑错误,而不是修复他的代码:p – Nico

+0

好吧,有'y.getLine'部分。唯一的问题是它不存在。 – chris

2

尼科的答案可能是一个更好的路径给你,但对于那些谁喜欢比较惯用的方式,我建议你可以轻松地打印向后一旦存储线的向量。的第一件事将是一个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类,获取行输入和反转它们的算法可以保持不变,就好像我们用单词进行操作一样,但切换到行只需要用Line替换std::string的几个实例。

+0

用户表示他不知道矢量。这暗示用户的班级尚未被教导如何进行班级。 – Nico

+0

@Nico,我意识到这一点。这就是为什么我在开始时给你的答案建议你的答案。这对于那些对类和算法有更多了解并希望实现这一目标的未来访问者来说更是如此。 – chris

相关问题