【问题标题】:Printing string inputs in reverse order以相反的顺序打印字符串输入
【发布时间】:2013-01-09 06:42:12
【问题描述】:

我正在尝试构建一个程序,它以相反的顺序输出输入,直到输入“停止”一词。 例如,如果我输入

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,我得到了没有输出的错误。 谁能帮帮我?

【问题讨论】:

  • y 变成vector&lt;string&gt; 不是更简单吗?而且您确实意识到字符串不存在这两个函数对吗?
  • 对不起,我还没有矢量知识..
  • 一定要“停止”吗?文件结尾往往会更好地处理所有内容。如果是您提出要求,请记住这一点。

标签: c++ string getline output


【解决方案1】:

为什么不交换你附加的顺序?

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

【讨论】:

  • 这将输出“停止”。一个简单的解决方法是while ((std::cin &gt;&gt; x) &amp;&amp; x != "stop")。另一个问题是它需要在新行上打印,这需要以最简单的形式使用std::getline
  • 只是指出了添加中的逻辑错误,而不是修复他的代码:p
  • 嗯,有y.getLine 部分。唯一的问题是它不存在。
  • @user1940749,这就是getline 部分的作用。它读取一行输入并将其存储到x
  • 感谢你们,我让它按照我想要的方式运行。我有一个问题,当 Karthik 说函数 getline 不适用于字符串时,这次它是如何工作的?还是我很愚蠢..
【解决方案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 而不是&gt;&gt;。这是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 类,获取行输入并反转它们的算法可以保持与我们使用单词执行的相同,但是切换到行只需要将std::string 的几个实例替换为@987654332 @。

【讨论】:

  • 用户表示不知道vector。这暗示用户的课程尚未被教授如何制作课程。
  • @Nico,我意识到这一点。这就是为什么我在开头有注释推荐你对 OP 的回答。对于对类和算法有更多了解并希望完成此任务的未来访问者来说,这确实意味着更多。
猜你喜欢
  • 2022-08-20
  • 2017-04-02
  • 2016-09-25
  • 1970-01-01
  • 2022-01-17
  • 2016-02-17
  • 1970-01-01
  • 2015-05-05
  • 2021-08-23
相关资源
最近更新 更多