如果用户键入无效值,为什么这段从 cin 读取的代码会无限递归?
Why does this code that reads from cin recurse infinitely if the user types an invalid value?
我正在学习C++,我写了这段代码:
#include <iostream>
namespace input
{
template <typename T>
T prompt_user(std::string prompt)
{
T input;
std::cout << prompt << ": ";
std::cin >> input;
if (std::cin.fail())
{
std::cin.clear();
prompt_user<T>(prompt);
}
return input;
}
} // namespace input
如果用户输入无效值,我的 if
语句会 和 std::cin.fail() 捕获它(我想你就是这样做)然后重新开始。但它会无限循环我的代码并跳过 cin
。我该如何解决这个问题?
重新开始时,您只是再次读取了相同的无效值。您没有代码来确定无效值在输入流中的开始和结束位置并将其删除。
尚不清楚修复方法是什么。无效值的组成可能取决于类型。你想丢弃一行吗?在找到有效输入之前要丢弃字符吗?或者什么?
您需要决定您想要的行为并对其进行编码。
我不得不在 std::cin.clear()
下面添加 std::cin.ignore(std::numeric_limits<std::streamsize>, '\n')
。我很抱歉我搞砸了。
我正在学习C++,我写了这段代码:
#include <iostream>
namespace input
{
template <typename T>
T prompt_user(std::string prompt)
{
T input;
std::cout << prompt << ": ";
std::cin >> input;
if (std::cin.fail())
{
std::cin.clear();
prompt_user<T>(prompt);
}
return input;
}
} // namespace input
如果用户输入无效值,我的 if
语句会 和 std::cin.fail() 捕获它(我想你就是这样做)然后重新开始。但它会无限循环我的代码并跳过 cin
。我该如何解决这个问题?
重新开始时,您只是再次读取了相同的无效值。您没有代码来确定无效值在输入流中的开始和结束位置并将其删除。
尚不清楚修复方法是什么。无效值的组成可能取决于类型。你想丢弃一行吗?在找到有效输入之前要丢弃字符吗?或者什么?
您需要决定您想要的行为并对其进行编码。
我不得不在 std::cin.clear()
下面添加 std::cin.ignore(std::numeric_limits<std::streamsize>, '\n')
。我很抱歉我搞砸了。