输入声明为double时检查输入是否为空[C]
我有三个变量声明为双精度:
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... 每次都会运行. 解决方法
就像是
cin >> Delay1; if(cin) { ... } 将无法按照您的规范工作,因为cin将跳过前导空格.用户不能只是按Enter键.他首先必须输入一些文字.如果他输入以下内容 3a 然后将输入读入double,直到a,停止. cin不会发现任何错误,并留在流中.通常,这是足够的错误处理,我认为.但是,如果要求您在用户输入上述内容时实际重复,则需要更多代码. 如果你想测试直到换行符的整个输入是否是一个数字,那么你应该使用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(); } 操作符>>将占用前导空格,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.运算符时转换为bool(if(cin)…)时使用operator void *!用于代码做!cin (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |