【发布时间】:2022-11-18 03:56:06
【问题描述】:
给定的程序读取单个单词的名字和年龄(以 -1 结尾)的列表,并输出随着年龄递增的列表。如果一行中的第二个输入是字符串而不是 int,程序将失败并抛出异常。在代码中的FIXME处,添加try/catch语句捕获ios_base::failure,并输出0为age。
例如:如果输入是:
Lee 18
Lua 21
Mary Beth 19
Stu 33
-1
那么输出是:
Lee 19
Lua 22
Mary 0
Stu 34
int main() {
string inputName;
int age;
// Set exception mask for cin stream
cin.exceptions(ios::failbit);
cin >> inputName;
while (inputName != "-1") {
// FIXME: The following line will throw an ios_base::failure.
// Insert a try/catch statement to catch the exception.
// Clear cin's failbit to put cin in a useable state.
try
{
cin >> age;
cout << inputName << " " << (age + 1) << endl;
}
catch (ios_base::failure& excpt)
{
age = 0;
cout << inputName << " " << age << endl;
cin.clear(80, '\n');
}
inputName = "";
cin >> inputName;
}
return 0;
}
我无法在捕获异常后清除 cin,甚至尝试将变量设置为空字符串...我的程序在 cin >> inputName 处停止;在捕获到异常之后,但我认为 cin.clear(80, '\n');重置 cin 并将其置于可用状态?
当我尝试将另一个字符串输入 inputName 变量时,调试器告诉我存在未处理的异常。感谢您的帮助,谢谢。
【问题讨论】:
-
你的程序does not compile。
std::cin.clear只接受一个值:要设置的新状态。 -
输入始终是文本,因此问题是文本是否可以转换为整数。方法是检查转换是否成功:
if (std::cin >> age) { /* do something with age */ } else { /* input failed; recover */ }。这是常用的习惯用法,它比尝试处理异常要简单得多。 -
clear设置流状态标志。它不会删除数据。您需要clear流,然后ignore错误的输入。
标签: c++