我想在给出意外输入时测试std::cin
的行为。为什么std::cin
以非确定的方式返回0和2.07386e-317?
#include <iostream>
using namespace std;
int main(){
double foo, bar;
while(cin.good() and cin >> foo >> bar){
cout << foo << " " << bar << endl;
}
if (cin.eof()){
cout << "Ooops, EOF encountered.\n";
}
else{
cout << "Something weird happened!\n";
cout << foo << " " << bar << endl;
}
return 0;
}
每当我输入时,
<a_number> <non-number>
输出为<a_number> 0
每当我输入时,
<non-number> <anything>
输出为0 2.07386e-317
我通过将输入数量增加到3和
来尝试确切的代码<non-number> <non-number> <non-number>
输出为0 0 2.07353e-317
对于4个输入,
`<non-number> <non-number> <non-number> <non-number>`
输出为0 2.07353e-317 0 2.07353e-317
最后,对于5个输入,
`<non-number> <non-number> <non-number> <non-number> <non-number>`
输出为0 2.07353e-317 2.07353e-317 0 2.07353e-317
我查看the November 2014 working draft of current standart (C++14)并且在第27.4.2节中看不到任何有用的信息,其中窄流对象的解释方式非常简短。我希望看到std::cin
的内部工作细节。我错过了什么吗?
我很好奇行为的原因。感谢帮助。
答案 0 :(得分:2)
你不应该试图在“发生奇怪的事情”的情况下打印变量,因为这意味着变量提取不成功。从第一个错误输入开始的任何变量都不会被分配。
请参阅How to test whether stringstream operator>> has parsed a bad type and skip it了解如何跳过错误输入。