C++ 使用 cin.fail(), cin.clear() ---我有一个无限循环,不知道为什么
C++ Using cin.fail(), cin.clear() --- I have an infinite loop and don't know why
你能不能像这样在同一行中使用 cin 然后使用 cin.fail()?有没有一种更干净或更标准的方法来在输入时进行这种类型的错误检查?--也许不使用 do-while。
do {
cin.clear();
cout << "nPlease enter the size of the array (1-10): ";
} while (cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail());
这个工作:
do {
cout << "Please input #: ";
if (cin.fail()){
cin.clear();
cin.ignore(80, 'n');
}
cin >> kids_total;
} while (cin.fail() || kids_total <= 0);
cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail()
假设你在 cin
中有一个字母,cin >> array_size
评估false
,因此&&
短路评估跳过array_size <= 1
进行测试:
-
array_size >= 10
:可能是未初始化的内存读取==>未定义的行为,否则可能false
-
cin.fail()
- 绝对true
。除非有未定义的行为 - 甚至可能如此 - 循环将继续而不会从cin
中删除字母,只是立即再次失败。
检查cin.ignore
是否有一种方法来删除解析失败的输入,或者使用 std::getline(std::cin, my_string)
、std::istringstream iss(my_string); if (iss >> array_size
等来保证整行被错误输入丢弃的方法。
相比之下,这是非常强大的,恕我直言,如果冗长,也很直观。 如果多次这样做,只需创建一个函数....
while (true)
{
std::cout << "Please input #: ";
if (std::cin >> kids_total)
{
if (kids_total > 0)
break;
std::cout << "Value must be > 0, please try again.n";
}
else if (std::cin.eof())
{
// rare for keyboard input - e.g. ^D on UNIX/Linux, ^Z Windows
// can happen with pipes/redirects - e.g. echo 10 20 | ./my_app
std::cerr << "expected value for kids_total but encountered end of inputn";
exit(EXIT_FAILURE);
}
else
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
}
}
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 在 Stream C++ 文本之前有一个额外的换行符
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++ 使用 cin.fail(), cin.clear() ---我有一个无限循环,不知道为什么
- 我需要一个类似std::cin的Mac上的C++函数,但有一个超时