由于我对异常非常陌生,因此在下面的内存异常代码方面遇到了一些麻烦。基本上,我需要计算并显示10个正输入的总和。在输入期间,我的程序应使用异常机制来显示一条消息,提示输入负数/非数字(NaN)(如果允许),然后退出程序。我被告知使用 std :: cin.fail()来检测输入的值是否适合变量类型(但是我不确定如何实现)。非常感谢您的帮助!
#include <iostream>
int main() {
int number;
int a=-2;
try {
for(int i=0; i<10;i++) {
std::cin>>number;
}
}
catch (...) {
number==-number?
std::cout << "Its negative"<<std::endl;
number==a?
std::cout << "Its NaN"<<std::endl;
}
}
答案 0 :(得分:0)
您说“ 10个积极的投入”,但您有int number;
。如果您的number
将是一个整数,那么它就不能像33.44
这样的分数,也不能是NaN
(因此您不需要检查)。如果要允许分数,请改为使用double number
。除此之外,支票可能看起来像这样:
for (int i = 0; i < 10; i++) {
std::cin >> number;
if (std::cin.fail()) {
std::cin.clear();
std::string input;
std::cin >> input;
std::cout << "input failed! Invalid input: " << input << std::endl;
return -1;
}
在输入每个数字后,请进行std::cin.fail()
检查。如果失败,您可以返回。在此示例中,我还使它打印了无效的输入。为此,您需要调用std::cin.clear();
来重置该错误标志,然后可以将该无效输入放入std::string
中(应该工作,与number
不同)。您需要为此添加<string>
。如果您不需要打印任何内容,则只需return
并忽略清除,字符串和输出。另外,在此示例中,由于无效输入造成的混乱被彻底清除,因此如果您不return
,则可以再次使用更多(有效)输入。
下一步,检查负数:
if (number < 0) {
std::cout << "Error: Negative number!" << std::endl;
return -1;
}
最后,NaN
检查(对于double
):
if (isnan(number)) {
std::cout << "Error: number is NaN!" << std::endl;
return -1;
}
<math.h>
中需要包含isnan
。
将它们放在一起,看起来可能像这样:
#include <iostream>
#include <string> // std::istream >> std::string
#include <math.h> // isnan
int main() {
double number;
for (int i = 0; i < 10; i++) {
std::cin >> number;
if (std::cin.fail()) {
std::cin.clear();
std::string input;
std::cin >> input;
std::cout << "input failed! Invalid input: " << input << std::endl;
return -1;
}
if (number < 0) {
std::cout << "Error: Negative number!" << std::endl;
return -1;
}
if (isnan(number)) {
std::cout << "Error: number is NaN!" << std::endl;
return -1;
}
}
return 0;
}