【问题标题】:How to break the inner while(cin>>s2) loop without breaking the outter while(cin>>s1) loop?如何在不破坏外部整体(cin>>s1)循环的情况下打破内部while(cin>>s2)循环?
【发布时间】:2021-08-19 15:20:52
【问题描述】:

请考虑下面的 C++ 代码:

#include <string>
#include <iostream>
using namespace std;

void fun1() {
  cout << "Calling fun1" << endl;
}
void fun2() {
  cout << "Calling fun2" << endl;
}

int main() {
  string s1, s2;
  while (cin >> s1) {
    fun1();
    while (cin >> s2) {
      fun2();
    }
  }
  return 0;
}

代码中有两个嵌套的while循环,在外层while循环中,使用cin输入值并调用fun1;然后进入内部while循环,使用cin输入一个值并调用fun2。但是当我想通过ctrl + d 终止内部while 循环时,我发现外部while 循环也终止了。我知道我可以使用下面的代码 sn -p 来解决这个问题,但是我想知道为什么会出现上述情况?提前致谢。

  while (cin >> s1) {
    if (s1 == "end1")
      break;
    fun1();
    while (cin >> s2) {
      if (s2 == "end2")
        break;
      fun2();
    }
  }

【问题讨论】:

  • 使用ctrl-D(或Windows 上的ctrl-Z)关闭标准输入完全在您的程序之外——这不是编译器放入可执行文件的代码的结果,而是操作系统做它的事情的结果。这实际上是关于您的计算机如何工作的问题,而不是关于编程的问题。

标签: c++ while-loop cin


【解决方案1】:

但我想知道为什么会发生上述情况?

当您按下Ctrl-D(Windows 上为Ctrl-Z)时,您将关闭流,因此std::cin 状态返回 false 并且内部循环终止。当您在两个循环中使用相同的流 - std::cin 并且流已经关闭时,它将终止它们,因为这种状态是持久的。可行的解决方案不是关闭而是使用一些标记来终止内部循环,这样它就不会影响外部循环,就像您在第二个示例中所做的那样。

【讨论】:

  • 感谢您的重播!我知道原因了!
  • std::cin::clear 可能会清除错误情况,例如读取错误的数据。你不能以这种方式重新打开它,它是不可逆的。
  • 我试图通过cin.clear 再次使std::cin 有效,但外部循环仍然终止。我做错什么了吗?代码 sn-p 如下:C++ while (cin &gt;&gt; s1) { fun1(); while (cin &gt;&gt; s2) { fun2(); } cin.clear(); }
  • 我想我完全理解这个问题。也就是说,当我按下Ctrl-D时,我关闭了流,而不是使流处于错误状态。所以std::cin::clear 没有工作,因为流已经关闭。感谢您的重播!
猜你喜欢
  • 1970-01-01
  • 2012-12-07
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多