我正在尝试使用try-catch块来验证输入,并且遇到了一些小问题。
如果对于第一个循环,用户输入数字,后跟字母(123abc),程序直接跳转到第二个循环并且没有给出错误,但是如果反转(abc123)错误消息正常工作
同样,如果在输入int时输入一个double值(45.1),则程序将45作为int(x),0.1作为double(y)。我需要它来抛出错误,或者如果它只是将数字四舍五入到最接近的整数值
就会很高兴代码:
int x;
double y, z;
while (1)
{
try
{
std::cout << "Enter an int (x): ";
if (std::cin >> x && x > 0) { break; }
else if (!std::cin) { throw x; }
else { throw x; }
}
catch (int)
{
std::cout << "Error: Not a valid integer.\n\n";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
while (1)
{
try
{
std::cout << "Enter a double (y): ";
if (std::cin >> y && y > 0) { break; }
else if (!std::cin) { throw y; }
else { throw y; }
}
catch (double)
{
std::cout << "Error: Not a valid double.\n\n";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
z = x + y;
std::cout << "\n\n" << x << " + " << y << " = " << z;
答案 0 :(得分:2)
我写了一个函数,它接受一行输入,从int中提取一个int,并检查是否还有其他垃圾。我使用std::ws
操纵器来摆脱不应该是错误的尾随空格,IMO。
bool parse_int(int& i)
{
std::string line;
std::getline(std::cin, line);
std::istringstream iss(line);
return (iss >> i && (iss >> std::ws).peek() == EOF);
}
然后将其用作:
int i;
if ( parse_int(i) ) /* ok */
或者,如果您不关心冗余数据,则可以在使用istream::ignore
获取int后忽略。
另外,投掷算术类型很奇怪。 <{3}}异常类的某些子类更合适。
答案 1 :(得分:0)
int main()
{
std::stringstream ss;
int x;
ss << "123abc";
ss >> x;
std::cout << x << std::endl; // 123
// And
ss << "abc123";
ss >> x;
std::cout << x << std::endl; // 0
return 0;
}
流逐个处理每个字符,并根据询问的类型停止无效的caractere。