我有三个变量声明为双精度:
double Delay1 = 0;
double Delay2 = 0;
double Delay3 = 0;
我然后从用户获取他们的值:
cout << "Please Enter Propogation Delay for Satellite #1:";  
cin >> Delay1;
...
但是,当我检查这些值以查看它们是否为空(用户只需按Enter键并且没有输入数字)时它不起作用:
if(Delay1  || Delay2 || Delay3 == NULL)  
      print errror...
每次都会运行.
检查已声明为double的输入是否为空的正确方法是什么?
Joh*_*itb 11
就像是
cin >> Delay1;
if(cin) { ... }
将无法按照您的规范工作,因为cin将跳过前导空格.用户不能只是按Enter键.他首先必须输入一些文字.如果他输入以下内容
3a
然后输入被读入double,直到a,它停止.cin不会发现任何错误,并a在流中留下.通常,这是足够的错误处理,我认为.但是,如果要求您在用户输入上述内容时实际重复,则需要更多代码.
如果你想测试直到新行的整个输入是否是一个数字,那么你应该使用getline,读入一个字符串,然后尝试转换为一个数字
string delay;
if(!getline(std::cin, delay) || !isnumber(delay)) {
  ...
}
该isnumber函数可以使用字符串流来测试字符串
bool isnumber(string const &str) {
  std::istringstream ss(str);
  double d;
  // allow leading and trailing whitespace, but no garbage
  return (ss >> d) && (ss >> std::ws).eof();
}
该operator>>会吃的空白,以及std::ws将消耗尾随空白.如果它到达流的末尾,它将发出信号eof.这样,您可以立即向用户发出错误信号,而不是在您下次尝试读取时错误输出cin.
编写一个类似的函数,它返回double或将double的地址传递给`isnumber,这样它就可以在成功解析时写出结果.
这也是值得看看的各种错误标志,以及它们如何涉及到operator void*,operator!,good(),fail(),bad()并且eof()它可以是相当混乱:
            flag | badbit  |  failbit  |  eofbit
function         |         |           |
-----------------+---------+-----------+--------
op void*         |    x    |     x     |
-----------------+---------+-----------+--------
op !             |    x    |     x     |
-----------------+---------+-----------+--------
good()           |    x    |     x     |    x
-----------------+---------+-----------+--------
fail()           |    x    |     x     |
-----------------+---------+-----------+--------
bad()            |    x    |           |
-----------------+---------+-----------+--------
eof()            |         |           |    x
-----------------+---------+-----------+--------
有一个x当相应位影响的结果.operator void*转换为bool(if(cin) ...)时operator!用于代码执行时使用!cin