如何在不破坏外部 while(cin>>s1) 循环的情况下打破内部 while(cin>>s2) 循环?
How to break the inner while(cin>>s2) loop without breaking the outter while(cin>>s1) loop?
请考虑以下 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 循环也终止了。我知道我可以使用下面的代码片段来解决这个问题,但我想知道为什么会出现上述情况?提前致谢。
while (cin >> s1) {
if (s1 == "end1")
break;
fun1();
while (cin >> s2) {
if (s2 == "end2")
break;
fun2();
}
}
but I want to know why does the above happen?
当您按下 Ctrl-D
(Ctrl-Z
on Windows)时,您关闭了流,因此 std::cin
status returns false 并且内部循环终止。当您使用相同的流 - std::cin
在两个循环中并且流已经关闭时,它会终止它们,因为这种状态是持久的。可行的解决方案不是关闭而是使用一些标记来终止内部循环,这样它就不会影响外部循环,就像您在第二个示例中所做的那样。
请考虑以下 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 循环也终止了。我知道我可以使用下面的代码片段来解决这个问题,但我想知道为什么会出现上述情况?提前致谢。
while (cin >> s1) {
if (s1 == "end1")
break;
fun1();
while (cin >> s2) {
if (s2 == "end2")
break;
fun2();
}
}
but I want to know why does the above happen?
当您按下 Ctrl-D
(Ctrl-Z
on Windows)时,您关闭了流,因此 std::cin
status returns false 并且内部循环终止。当您使用相同的流 - std::cin
在两个循环中并且流已经关闭时,它会终止它们,因为这种状态是持久的。可行的解决方案不是关闭而是使用一些标记来终止内部循环,这样它就不会影响外部循环,就像您在第二个示例中所做的那样。