In: Computer Science
Exception handling to detect input string vs. int
The given program reads a list of single-word first names and ages (ending with -1), and outputs that list with the age incremented. The program fails and throws an exception if the second input on a line is a string rather than an int. At FIXME in the code, add a try/catch statement to catch ios_base::failure, and output 0 for the age.
Ex: If the input is:
Lee 18 Lua 21 Mary Beth 19 Stu 33 -1
then the output is:
Lee 19 Lua 22 Mary 0 Stu 34
---------------------------------------------------------
#include
#include
using namespace std;
int main(int argc, char* argv[]) {
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.
cin >> age;
cout << inputName << " " << (age + 1) <<
endl;
cin >> inputName;
}
return 0;
}
Here is the completed code for this problem. Comments are included, go through it, learn how things work and let me know if you have any doubts or if you need anything to change. If you are satisfied with the solution, please rate the answer. If not, PLEASE let me know before you rate, I’ll help you fix whatever issues. Thanks
#include<iostream>
#include<iomanip>
using namespace std;
int main(int argc, char* argv[]) {
string inputName;
int age;
// Set exception mask for cin stream
cin.exceptions(ios::failbit);
cin >> inputName;
while(inputName != "-1") {
//putting the code to read age inside a try catch block
try{
cin >> age;
cout << inputName << " " << (age + 1) << endl;
}catch(ios_base::failure err){
//if ios_base::failure occurred, clearing error state
cin.clear(); //note: clearing failbit only using cin.clear(ios::failbit) is problematic
//most of the times, so it is always better to clear all error state.
//ignoring everything until the newline character (ignoring rest of the contents of
//current line)
cin.ignore(1000,'\n');
//displaying name with age 0
cout << inputName << " 0" << endl;
}
//reading next name
cin >> inputName;
}
return 0;
}
/*INPUT*/
Lee 18
Lua 21
Mary Beth 19
Stu 33 -1
/*OUTPUT*/
Lee 19
Lua 22
Mary 0
Stu 34