C++ 中的 I/O 异常问题("cin"语句)
problem with I/O exception in c++ ("cin" statement)
在以下程序中:
int main(){
std::cout<<"enter numbers to be divide"<<std::endl;
int a,b,c;
while(true){
try{
if(!(std::cin>>a>>b)){
throw std::invalid_argument("please enter proper interger");
}
if(b==0){
throw std::runtime_error("please enter enter nonzero divisor");
}
c=a/b;
std::cout<<"quotient = "<<c<<std::endl;
}
catch(std::invalid_argument e){
std::cout<<e.what()<<"ntry again?enter y/n";
char c;
std::cin>>c;
if(c=='n'||c=='N') break;
}
catch(std::runtime_error e){
std::cout<<e.what()<<"ntry again?enter y/n";
char c;
std::cin>>c;
if(c=='n'||c=='N') break;
}
}
return 0;
}
我使用了两种异常。程序在抛出"runtime_error"异常时正常工作,但在遇到"invalid_argument"异常时进入无限循环。实际上catch-block中的"cin>>c
"语句有问题,但不知道为什么会出现这种情况。
当std::cin>>a>>b
遇到非数字字符时,会发生两件相关的事情:
- 违规字符不被消耗;
- 设置
std::cin
失效位。
后者阻止所有从std::cin
进一步读取成功。这包括在invalid_argument
catch块中的那些和在循环的后续迭代中的那些。
要解决这个问题,您需要清除std::cin
的状态并消耗违规字符。下面KennyTM给出的答案很好地解释了这一点:c++ character to int.
您可以使用异常掩码,您可能会找到更好的方法来处理错误。
相关文章:
- 为什么我的两个 cin 语句没有在程序结束时运行?
- cin语句在循环的第三次迭代中被跳过
- 使用 cin、if 语句和数组不起作用
- 为什么当我输入字符时,这个特定的 cin.get() 语句在C++中不起作用?
- 两个 cin / cout 语句合并为一个
- 如果一个人失败,如何防止多个CIN语句失败
- 如何在开关语句中使用 cin "as a parameter"
- 使用自定义宏来简化 cin 和 cout 语句等内容被认为是更好还是更差
- std::cin 语句不起作用 C++
- cin.getline() 不适用于 switch 语句
- C++ 在 switch 语句中,cin.getline 不会分配给 c 字符串变量
- cin.getline 不使用 switch 语句
- cin.get();当我把它放在 if 语句中时不起作用
- 代码跳过 getline 语句.我尝试了getline和cin都没有成功
- 当在if语句中时,cin如何评估为true
- while 循环不能有两个 CIN 语句吗?
- 使用std::cin语句进行自动超时
- 如何在c++中使用两个cin语句
- cin语句不会编译
- C++ 中的 I/O 异常问题("cin"语句)