MGE
MGE

Reputation: 932

Using getline() in C++

I have a problem using getline method to get a message that user types, I'm using something like:

string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);

However, it's not stopping to get the output value, what's wrong with this?

Upvotes: 57

Views: 280083

Answers (7)

confused_
confused_

Reputation: 1691

I know I'm late but I hope this is useful. Logic is for taking one line at a time if the user wants to enter many lines

int main() 
{ 
int t;                    // no of lines user wants to enter
cin>>t;
string str;
cin.ignore();            // for clearing newline in cin
while(t--)
{
    getline(cin,str);    // accepting one line, getline is teminated when newline is found 
    cout<<str<<endl; 
}
return 0; 
} 

input :

3

Government collage Berhampore

Serampore textile collage

Berhampore Serampore

output :

Government collage Berhampore

Serampore textile collage

Berhampore Serampore

Upvotes: 1

logankilpatrick
logankilpatrick

Reputation: 14561

I had similar problems. The one downside is that with cin.ignore(), you have to press enter 1 more time, which messes with the program.

Upvotes: 3

Natan Streppel
Natan Streppel

Reputation: 5866

If you're using getline() after cin >> something, you need to flush the newline character out of the buffer in between. You can do it by using cin.ignore().

It would be something like this:

string messageVar;
cout << "Type your message: ";
cin.ignore(); 
getline(cin, messageVar);

This happens because the >> operator leaves a newline \n character in the input buffer. This may become a problem when you do unformatted input, like getline(), which reads input until a newline character is found. This happening, it will stop reading immediately, because of that \n that was left hanging there in your previous operation.

Upvotes: 106

Antonija
Antonija

Reputation: 21

int main(){
.... example with file
     //input is a file
    if(input.is_open()){
        cin.ignore(1,'\n'); //it ignores everything after new line
        cin.getline(buffer,255); // save it in buffer
        input<<buffer; //save it in input(it's a file)
        input.close();
    }
}

Upvotes: 2

Some programmer dude
Some programmer dude

Reputation: 409482

If you only have a single newline in the input, just doing

std::cin.ignore();

will work fine. It reads and discards the next character from the input.

But if you have anything else still in the input, besides the newline (for example, you read one word but the user entered two words), then you have to do

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

See e.g. this reference of the ignore function.

To be even more safe, do the second alternative above in a loop until gcount returns zero.

Upvotes: 6

Konstantin
Konstantin

Reputation: 2659

The code is correct. The problem must lie somewhere else. Try the minimalistic example from the std::getline documentation.

main ()
{
    std::string name;

    std::cout << "Please, enter your full name: ";
    std::getline (std::cin,name);
    std::cout << "Hello, " << name << "!\n";

    return 0;
}

Upvotes: -1

No Idea For Name
No Idea For Name

Reputation: 11607

i think you are not pausing the program before it ended so the output you are putting after getting the inpus is not seeing on the screen right?

do:

getchar();

before the end of the program

Upvotes: -1

Related Questions