#include <iostream>
using namespace std;
int main(){
//set variables
string name1;string name2;string name3;string n1;string n2;string n3;
int age1; int age2; int age3;
//get names and ages
cout << "Who Is The First Student?"<< endl;
getline(cin, name1); //name 1
cout << "What is " << name1<< "'s Age?"<< endl;
cin >> age1; // age 1
cout << "Who Is The Second Student?"<< endl;
getline(cin, name2); //name 2
cout << "What is " << name2<< "'s Age?"<< endl;
cin >> age2; //age 2
cout << "Who Is The Third Student?"<< endl;
getline(cin, name3); // name 3
cout << "What is " << name3<< "'s Age?"<< endl;
cin >> age3; //age 3
// gets modified names
n1 = name1.substr(2, name1.size() -3);
n2 = name2.substr(2, name2.size() -3);
n3 = name3.substr(2, name3.size()-3);
// Output formatting
cout << "Name Age Modified"<<endl;
cout << name1<< " "<<age1<<" "<<n1<<endl;
cout << name2<< " "<<age2<<" "<<n2<<endl;
cout << name3<< " "<<age3<<" "<<n3<<endl;
return 0;
}
The output asks the first question which is for the name of the first student but it outputs as this:
Who Is The First Student?- John Doe- What is John's Age?- 19- Who Is The Second Student?- What is 's Age?-
It is skipping the user input of the second student's name and instantly asking for the age but I don't know why this is happening, is there something wrong with my code or do I have the formatting incorrect? I believe that I used the getline function correctly but I may be incorrect and unaware of it being skipped over by a more important function.
CodePudding user response:
The std::string::substr() man page says this about the exception you are seeing:
Parameters
pos - position of the first character to include
count - length of the substring
Exceptions
[throws] std::out_of_range if pos > size()
CodePudding user response:
The main problem of the program is that the operator >>
reads only one word.
That is for example in these statements
cout << "Who Is The First Student?"<< endl;
cin >> name1; //name 1
You entered a string that contains two words "John Doe"
. But the operator >>
reads only the first word "Jphn"
in the variable name1
.
So in the next input statement
cout << "What is " << name1<< "'s Age?"<< endl;
cin >> age1; // age 1
an error occurred because instead of a number the input buffer contains the word "Doe"
.
So as a result the variables name1
, name2
, and name3
do not contain what you are expecting. And these statements
n1 = name1.substr(2, name1.size()-3);
n2 = name2.substr(2, name2.size()-3);
n3 = name3.substr(2, name3.size()-3);
produce the run-time error.
Instead of the operator >>
you should use standard function std::getline
.
Here is a demonstration program based on the code of your program that shows what is the reason of the error
#include <iostream>
#include <string>
int main()
{
std::string name1, name2;
int age1;
//get names and ages
std::cout << "Input 3 Names Below:" << std::endl;
std::cout << "Who Is The First Student?" << std::endl;
std::cin >> name1; //name 1
std::cout << "What is " << name1 << "'s Age?" << std::endl;
std::cin >> age1; // age 1
std::cout << "Who Is The Second Student?" << std::endl;
std::cin >> name2; //name 2
std::cout << "name1 = " << name1 << '\n';
std::cout << "name2 = " << name2 << '\n';
}
The program output is
Input 3 Names Below:
Who Is The First Student?
John Doe
What is John's Age?
Who Is The Second Student?
name1 = John
name2 =
As you can see due to the error of reading a data in the variable age1 (the buffer contains the string "Doe"
) the object name2
is empty. So if you will use it in this statement
n2 = name2.substr(2, name2.size()-3);
then the runtime error will occur.