Why Does std::getline() Skip Input After a Formatted Extraction?
Last Updated :
03 Apr, 2024
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.
Share your thoughts in the comments
Please Login to comment...