有点像
cin >> Delay1;
if(cin) { ... }
不会根据您的规范工作,因为cin 将跳过前导空格。用户不能只是按回车键。他首先必须输入一些文字。如果他输入以下内容
3a
然后输入被读入双精度,直到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 读取时出错。
编写一个类似的函数,返回双精度数或将双精度数的地址传递给`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