miguelarcilla
miguelarcilla

Reputation: 1456

Why doesn't getline(cin, var) after cin.ignore() read the first character of the string?

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);
}

Upvotes: 2

Views: 5612

Answers (5)

Shashwat Shukla
Shashwat Shukla

Reputation: 1

So basically, cin>>var leaves the '\n' character out of its buffer. So now when you call getline it reads the '\n' character and stops. Therefore we use cin.ignore() to ignore the first character getline reads i.e '\n' when we use it after cin.

But getline doesn't leave '\n' character instead it stores everything in its buffer till it find '\n' character, then stores '\n' character as well and then stops.

So in your code when you are using cin.ignore() after a getline and again uses getline to take input, it ignores the first character of the string instead of '\n'. That is why the first character is missing.

Hope this answers your question.

Upvotes: 0

iampranabroy
iampranabroy

Reputation: 1796

You are using std::isstream::ignore() before std::getline(). std::cin.ignore() will extract the first character from the input sequence and discard that.

http://www.cplusplus.com/reference/istream/istream/ignore/

Upvotes: 0

P0W
P0W

Reputation: 47814

cin>>var;

only grabs the var from the buffer, it leaves the \n in the buffer, which is then immediately grabbed up by the getline

So, following is just fine, (if I understood correctly your problem)

cin>>var;
cin.ignore();     //Skip trailing '\n'
getline(cin, var);

As per your edited post

You don't have to use cin.ignore(); for geline

This extracts characters from buffer and stores them into firstName or (lastName) until the delimitation character here -newline ('\n').

Upvotes: 7

Saksham
Saksham

Reputation: 9380

std::cin.ignore() will ignore the first character of your input.

For your case, use std::cin.ignore() after std::cin and then getline() to ignore newline character as:

cin>>ch;
cin.ignore();  //to skip the newline character in the buffer
getline(cin,var);

Upvotes: 1

Fabio A. Correa
Fabio A. Correa

Reputation: 2036

ignore() does not skip a line, it skips a character. Could you send example code and elaborate on the need for cin.ignore()?

Upvotes: 1

Related Questions