Open In App

Why Does std::getline() Skip Input After a Formatted Extraction?

Last Updated : 03 Apr, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

In C++, the std::getline() function is a common method for reading a line of text from an input stream. However, when used after a formatted extraction operation, it may sometimes skip input. In this article, we will learn why does std::getline() skips input after a formatted extraction and how to prevent it.

Problem of std::getline() Skipping Input After a Formatted Extraction

The std::getline() function skips input when used after a formatted extraction operation. This issue arises due to the behavior of formatted extraction operations that are used to extract data in a predefined format from an input stream, such as std::cin >>, which leaves the newline character (‘\n’) in the input buffer. When std::getline() is called after that, it reads until it encounters a newline character, which is still in the buffer from the previous input. As a result, std::getline() immediately stops reading and returns an empty string, giving the impression that it has skipped input.

Example 1: Showing the Case where  std::getline() Skips the Input

C++
// C++ Program where getline() skips input after a formatted
// extraction
#include <iostream>
#include <string>
using namespace std;

int main()
{
    int num;
    string str;

    cout << "Enter a number: ";
    // read a number
    cin >> num;

    cout << "Enter a string: ";
    // try to read string
    getline(cin, str);
    cout << endl;

    cout << "Number: " << num << endl;
    cout << "String: " << str << endl;

    return 0;
}


Output

Enter a number: 5
Enter a string: 
Number: 5
String:

Explanation: In the above code, we entered a number and then a string, we noticed that the program doesn’t pause for the string input and str remains empty only.

Preventing std::getline() from Skipping Input

To resolve the above issue we can use the std::cin.ignore() function after the formatted extraction operation that extracts and discards characters from the input buffer until it encounters a newline character or reaches a specified limit.

C++ Program to Use getline() Without Skipping Input after a Formatted Extraction

The below example demonstrates how we can take input using gettline() without skipping input after a formatted extraction.

C++
// C++ Program to demonstrates how we can take input using
// gettline() without skipping input after a formatted
// extraction.
#include <iostream>
#include <string>
using namespace std;
int main()
{
    int number;
    string str;

    // Read an integer
    cout << "Enter a number: ";
    cin >> number;

    // Ignore the newline character left in the buffer
    cin.ignore();

    // Read a line of text
    cout << "Enter a string: ";
    getline(cin, str);

    // print the number and string
    cout << "Number: " << number << endl;
    cout << "String: " << str << endl;

    return 0;
}


Output

Enter a number: 5
Enter a string: Hello
Number: 5
String: Hello

Explanation: In the above code, std::cin.ignore() discards all characters up to the end including the next newline character. Now, the program correctly pauses for the string input after the number input.


Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads