在这种情况下,当标记的行hang point
接收到无效输入时,例如。abc
,它会重复内部do-while循环,并在再次到达该行时挂起。
// figure 1
std::string s;
do {
do {
std::cout<<"s = ";
std::getline(std::cin, s);
} while (s == "");
double d;
std::cout<<"d = ";
do {
std::cin.clear();
std::cin>>d; // hang point
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} while (std::cin.fail());
} while (s != "exit");
在这种情况下,程序将跳过该行,并永远重复执行do-while循环。
// figure 2
double d;
do {
std::cout<<"d = ";
std::cin.clear();
std::cin>>d; // skip point
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} while (std::cin.fail());
为什么?
最初,我要问为什么figure 1
挂起,并且在尝试简化示例的过程中,我figure 2
想到了,发现它没有挂起,但是一直重复着。我不明白为什么要这么做figure 1
或figure 2
做他们所做的事情。
编辑:cin
在我为自己写的提示符下输入字母数据,导致我失败了。例如。
s = something
d = 3
s = something
d = a
图2:您必须在cin.ignore()之前调用cin.clear()。否则,cin.ignore不会执行任何操作,因为cin仍处于错误状态。
double d;
do {
if (std::cin.fail()) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
std::cout<<"d = ";
std::cin>>d;
} while (std::cin.fail());
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句