C++ 使用cin.clear()删除异常中的失败状态

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

所以我试图理解为什么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*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;