I'm creating a simple console application in C++ that gets string and char inputs from the user. To make things simple, I would like to use the string and char data types to pass input from cin to.
To get string inputs, I'm using the getline method:
string var;
cin.ignore(); //I used ignore() because it prevents skipping a line after using cin >> var
getline(cin, var);
To get char inputs, I'm using the cin >> var method:
char var;
cin >> var;
This works fine for the most part. However, when I enter a string using getline, it ignores the first character of my string.
Is it possible to use getline and cin >> without having to use ignore, or a method I can call to ensure that my first character isn't skipped?
This is a full sample of code where I use both getline and cin >>:
string firstName;
string lastName;
char gender = 'A';
cout << "First Name: ";
cin.ignore();
getline(cin, firstName);
cout << "Last Name: ";
cin.ignore();
getline(cin, lastName);
while(genderChar != 'M' && genderChar != 'F')
{
cout << "Gender (M/F): ";
cin >> genderChar;
genderChar = toupper(genderChar);
}
ignore()
does not skip a line, it skips a character. Could you send example code and elaborate on the need forcin.ignore()
?cin>>var;
only grabs the
var
from the buffer, it leaves the\n
in the buffer, which is then immediately grabbed up by thegetline
So, following is just fine, (if I understood correctly your problem)
As per your edited post
You don't have to use
cin.ignore();
forgeline
This extracts characters from buffer and stores them into
firstName
or (lastName
) until the delimitation character here -newline ('\n'
).You are using
std::isstream::ignore()
beforestd::getline()
.std::cin.ignore()
will extract the first character from the input sequence and discard that.http://www.cplusplus.com/reference/istream/istream/ignore/
std::cin.ignore()
will ignore the first character of your input.For your case, use
std::cin.ignore()
afterstd::cin
and thengetline()
to ignore newline character as: