【问题标题】:How do I store a previous iteration in a while loop in C++?如何在 C++ 的 while 循环中存储先前的迭代?
【发布时间】:2012-09-10 04:58:30
【问题描述】:

我看到有类似标题的东西已经回答了,但是内容对我来说太密集了,因为我不太了解c++。

我对编程很陌生,我不知道如何在我的 while 循环中存储以前的迭代。我正在尝试使用 while 循环将用户文本写入文件,并以两个 \n 字符结束他们的输入。这就是我的问题所在,因为在我当前的代码中,输入以一个 enter 实例结束。

我的代码看起来像这样,但我知道tempnew_advice 是一样的:

char new_advice, temp;
while( (!(new_advice == '\n' + '\n'))) && (!(temp == '\n')) )
{
    temp = new_advice;
    cin.get(new_advice);
    fout.put(new_advice);
}

编辑* 好吧,我想我不清楚我在问什么。

最初的任务是“允许用户输入建议,这样它可以是任意数量的行。用户被告知通过按两次返回键来结束他或她的建议。然后你的程序可以测试到通过检查它何时读取两个连续出现的字符 '\n' 来查看它是否已到达输入的末尾。”

这会改变我的问题的任何答案吗?

我现在已经尝试用代码做到这一点:

char new_advice;
         int temp = 0;

         while(temp < 2)
         {
         if(new_advice == '\n')
         {
         temp = temp++;
         }
         cin.get(new_advice);
         fout.put(new_advice);

         }

但这也不起作用,我的程序无法将 enter 识别为结束程序。整个程序的上下文是否值得发布?

【问题讨论】:

  • 第一个明显的问题:'\n' + '\n' 不会创建包含两个换行符的字符串。 '\n' 将产生一个整数值,然后将其加倍,所以如果它是 10,结果将是一个值为 20 的单个字符。
  • 另一个明显的问题:在将new_advicetemp 设置为任何特定值之前,您正在测试它们的值(使用==)。在读取变量之前,您应该始终设置变量(即使只是一些恰好与您的逻辑一起使用的任意起始值,例如空格或'\n')。

标签: c++ loops while-loop


【解决方案1】:

我真的不想回答你的具体问题,因为做你想做的事的惯用方式是相当不同的,而且相当干净:

std::ofstream outfile("output.txt");

for (std::string line; std::getline(std::cin, line); )
{
    if (line.empty()) { break; }

    outfile << line << std::endl;
}

【讨论】:

    【解决方案2】:

    很多东西。

    首先,为了清楚起见,去掉多余的括号。然后,使用a != b 而不是!(a == b)

    这会产生while(new_advice != '\n' + '\n') &amp;&amp; temp != '\n'),我不确定它应该做什么(即使忽略不匹配的括号也会导致编译错误):'\n' + '\n' 添加两个字符,这是一个整数加法。但即使不是,而是字符串连接,您随后会将结果(两​​个字符的字符串)与单个字符进行比较。这永远不会产生true

    现在,关于逻辑:只需用回车符分隔每一行,并在末尾添加一个额外的回车符:

    std::string line;
    while (std::getline(std::cin, line))
        std::cout << line << "\n";
    
    std::cout << "\n";
    

    ...像 π 一样简单。

    但除此之外,以两个换行符结束输入是不寻常的。相反,惯例(在 UNIX 中)是每一行的末尾都由一个换行符分隔。

    【讨论】:

    • 一些文件格式用两个换行符分隔部分,例如邮件标准,对于标准输入,它可能很方便,因为您可能希望用户稍后输入其他内容。
    • @Tony 当然。这更像是一般性评论。
    【解决方案3】:

    如果在 + 表达式中使用,chars 将提升为 ints。你到底想比较什么?

    我的代码看起来像这样,但我知道 temp 和 new_advice 是一样的:

    那么这个
    (!(new_advice == '\n' + '\n'))) &amp;&amp; (!(temp == '\n')) 将立即失败。

    你的括号'不匹配。

    【讨论】:

      【解决方案4】:

      简化您的循环,以便在您输入时进行检查:while(cin) {

      如果您需要存储以前的值,请将该变量仅留在循环之外:

      char previous = '\0';
      while (cin) {
      

      我认为您确实想找到行尾并添加一个“\n”,但这在 windows 和 unix 之间是不可移植的。 std::getline 答案效果更好。但是,假设你想自己做这个......

      在循环中声明并赋予当前角色一个值。

          char current;
          cin >> current;
      

      然后再次检查cin,再次检查您是否确实收到了有效输入。

          if(!cin) {
              break;
          }
      

      接下来,对这个角色做任何你想做的事:

          fout << current;
          if(`\n` == current) {
              fout << '\n'; // though std::endl would be more portable
          }
      

      最后,更新你之前的变量。

          previous = current;
      }
      

      我尝试逐步解决此问题以了解所涉及的多个概念,但我认为您并不需要其中的大部分内容。 std::getline 答案会起作用,但不会教你所有你尝试做的事情。

      【讨论】:

        猜你喜欢
        • 2020-02-17
        • 2021-09-06
        • 2020-04-26
        • 1970-01-01
        • 2019-06-01
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多