ForeverLearning
ForeverLearning

Reputation: 6705

Why does a std::getline call on std::cin not wait for user input?

Is there any good reason why:

std::string input;
std::getline(std::cin, input);

the getline call won't wait for user input? Is the state of cin messed up somehow?

Upvotes: 8

Views: 5244

Answers (4)

Tauno Erik
Tauno Erik

Reputation: 11

This code does not work:

#include <iostream>
#include <string>

int main()
{
int nr;
std::cout << "Number: ";
std::cin >> nr;

std::string  input;
std::cout << "Write something: ";
getline(std::cin, input);
std::cout << "You input is: " << input << std::endl;

return 0;
}

This does work:

#include <iostream>
#include <string>

int main()
{
int nr;
std::cout << "Number: ";
std::cin >> nr;

std::string x;
std::getline(std::cin,x);

std::string  input;
std::cout << "Write something: ";
getline(std::cin, input);
std::cout << "You input is: " << input << std::endl;

return 0;
}

Upvotes: 1

Kedron Lucas
Kedron Lucas

Reputation: 1

this occurred cause before std::getline(std::cin, input); there's newline char (/n). The getline reads until it encounters /n. Therefore it will read an empty string and return null without waiting for the users input.

To counter this we use an dummy getline, or cin.ignore(1, /n);

Upvotes: 0

nn.
nn.

Reputation: 39

I have tested the following code and it worked ok.

#include <iostream>
using namespace std;
int main()
{
    string  input;
    getline(cin, input);
    cout << "You input is: " << input << endl;
    return 0;
}

I guess in your program that you might already have something in you input buffer.

Upvotes: 1

Shamim Hafiz - MSFT
Shamim Hafiz - MSFT

Reputation: 22114

Most likely you are trying to read a string after reading some other data, say an int.

consider the input:

11
is a prime

if you use the following code:

std::cin>>number;
std::getline(std::cin,input)

the getline will only read the newline after 11 and hence you will get the impression that it's not waiting for user input.

The way to resolve this is to use a dummy getline to consume the new line after the number.

Upvotes: 7

Related Questions