【问题标题】:Cant cin after terminating the while loop [closed]终止while循环后无法cin [关闭]
【发布时间】:2014-03-16 01:56:39
【问题描述】:
int n;
while(cin>>n)
    cout << n; // Run by the program if received an int value
cout << "Break from loop"; // Run by the program
cin >> n; // Skipped by the program
cout << n; // Run by the program

在使用字符终止 while 循环后无法接受另一个输入。

如果循环内的输入已使用非整数/浮点值终止,如何接受另一个输入。

【问题讨论】:

  • 这是一个正确的观察。
  • 你的问题到底是什么?
  • 有谁知道比cin.clear(); getline(cin,dummystring);更干净的方法吗?
  • @Beta 严重问题?
  • @0x499602D2:是的,对无法搜索“reset cin”的用户有点嘲讽。

标签: c++ loops while-loop infinite-loop


【解决方案1】:

如果您不是通过返回文件结尾(即Ctrl-D)或完全终止程序(即Ctrl-C)来终止程序。

也就是说,如果您通过不正确的数据类型退出循环,例如输入字母 d 而不是整数,则可以在 while 循环后面加上 cin.clear()getline(cin, str),其中 @987654327 @是你提前声明的一些string

在此之后,您应该能够接受第二个cin 的输入。

所以,

string str;
int n;
while(cin>>n)
    cout << n << endl;
cin.clear();
getline(cin, str);
cout << "Break from loop" << endl;;
cin >> n;
cout << n;

【讨论】:

  • 哇!这很好用。谢谢!
【解决方案2】:
int n;
while(cin>>n) // Keep asking for value to input
    cout<<n<<"\n"; // This loop will never terminate for any Supplied val
//Above loop will terminate only when no more valued is supplied to code
// Hence once, we stopped entering the value, code will execute next line
// And end without asking for anymore value.
 cout<<"Break From Loop \n";

【讨论】:

    【解决方案3】:

    假设您的问题是“如何在设置流状态后恢复输入?”那么有一个简单的解释:

    您执行提取的while 循环仅在提取失败之前终止;这还包括流到达输入流 (EOF) 末尾的时间。发生这种情况时,eofbit 将设置为蒸汽状态(以及故障位)。设置流状态后,流不能用于 I/O。为了再次使用它,必须清除流状态。这是使用成员函数clear(std::ios_base::iostate err = std::ios_base::goodbit) 完成的。

    std::cin.clear();
    

    该调用将清除流状态中的位并将它们分配给0 (std::ios_base::goodbit)。在此调用之后,流可以再次用于 I/O。

    这是假设流读取所有字符直到到达 EOF。对于在获取无效数据时终止的先前读取是不够的。还必须ignore() 其余字符。

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    【讨论】:

    • 如果没有额外的步骤来清除坏字符,这对我不起作用。你确定够了吗?
    • @Beta 这是假设流读取所有字符,直到达到 EOF。对于在获取无效数据时终止的先前读取是不够的。必须ignore() 残差数据。
    • 是的,这是我的问题,抱歉没有澄清。但是我仍然是菜鸟,所以我不了解 C++ 的技术细节。
    • @user3317046 请查看编辑。
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多