C++ 使用cin.clear()删除异常中的失败状态
所以我试图理解为什么cin.clear要去掉第一个词而不是第二个if 输入名字和姓氏,以及年龄数字。例如,如果输入为:C++ 使用cin.clear()删除异常中的失败状态,c++,C++,所以我试图理解为什么cin.clear要去掉第一个词而不是第二个if 输入名字和姓氏,以及年龄数字。例如,如果输入为: Lee 18 Lua 21 Mary Beth 19 Stu 33 -1 那么《玛丽·贝思19》中的“贝思”不是应该跳过吗?为什么取而代之的是清除“玛丽” 输出: Lee 18 Lua 21 Beth 19 Stu 33 #包括 #包括 使用名称空间std; int main(int argc,char
Lee 18
Lua 21
Mary Beth 19
Stu 33
-1
那么《玛丽·贝思19》中的“贝思”不是应该跳过吗?为什么取而代之的是清除“玛丽”
输出:
Lee 18
Lua 21
Beth 19
Stu 33
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[]){
字符串输入名;
智力年龄;
//设置cin流的异常掩码
cin.异常(ios::failbit);
while(inputName!=“1”){
//FIXME:下面的行将抛出一个ios_base::failure。
//插入try/catch语句以捕获异常。
//清除cin的故障位,使cin处于可用状态。
cin>>输入名称;
试一试{
cin>>年龄;
输入行的cout
Mary Beth 19
第一
cin >> inputName;
将把Mary
读入inputName
然后
尝试将Beth
解析为整数,但会失败并引发异常。然而,重要的是:输入不会被丢弃!相反,输入读取指针未经修改,它仍将“指向”Beth
清除错误后,循环将正常继续,返回到
cin >> inputName;
然后,它将继续将
Beth
读入inputName
,丢失旧值Mary
哦,有趣的是,我想它会清除当前正在尝试的内容,而不是最近放入变量的位置。还有比cin更好的函数吗。clear(),还是只是一个逻辑谜题,我把事情搞乱了?@T_lastname首先,我建议您使用例如std::getline
来逐行读取字符串。将该字符串放入std::istringstream
并从中提取数据。如果提取整数失败(不需要例外,只要一个普通的if(!(stream>>age))
)然后清除错误,将下一个“单词”提取到一个伪变量中,然后再次尝试读取age
。cin.clear()
不会从输入流中删除任何内容。它会重置错误标志。
cin >> age;
cin >> inputName;