gpt4 book ai didi

c++:仅cin整数

转载 作者:行者123 更新时间:2023-11-28 02:53:25 33 4
gpt4 key购买 nike

我正在尝试使用 try-catch block 验证输入,但遇到了一个小问题。

如果对于第一个循环,用户要输入数字,然后输入字母 (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;

最佳答案

我会编写一个函数,接受一行输入,从 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 后忽略它。 .

此外,抛出算术类型很奇怪。 std::logic_error 的一些子类异常类会更合适。

关于c++:仅cin整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22577249/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com