Reading a string from user [duplicate] - c++

This question already has answers here:
Using getline(cin, s) after cin [duplicate]
(13 answers)
Why does std::getline() skip input after a formatted extraction?
(5 answers)
Closed 6 years ago.
#include<iostream>
#include<cstring>
using namespace std;
int main() {
int t;
cin >> t;
string s;
getline(cin, s);
cout << s;
return 0;
}
As soon as I press the enter key after giving input for t, the program terminates as string takes the newline character as input. What can I do? I cannot output something between these two inputs and an enter after t is mandatory.

The Enter key you press to end the input for t is added to the input buffer. So the first input in the buffer seen by getline is the Enter key and it thinks you have given an empty line.
Use the ignore function to skip past the newline:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
You can also use two std::getline calls, and use e.g. std::stoi to convert the input an int. Or put in an std::istringstream and extract using the normal >> operator.

You may use getline(cin, s) twice. Fist will ignore rest of first line and the second will actually read what you need or better use cin.ignore() with appropriate arguments

Related

Why does getline() overwrite the content of my string? [duplicate]

This question already has answers here:
Why does std::getline() skip input after a formatted extraction?
(5 answers)
Closed 1 year ago.
I'm trying to figure out why when I read my string using getline() function my string gets empty
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
string s;
cin >> s;
getline(cin,s);
cout << s;
}
The getline reads characters from an input stream and places them into a string.
If you use "cin >> s" and then use getline(cin, s), you should first call cin.ignore() before it.
Because "std::getline()" performs the following:
Calls s.erase()
Extracts characters from input and appends them to s
If no characters were extracted for whatever reason, getline sets failbit and returns.
You should modify your code like below:
string s;
cin >> s;
cin.ignore();
std::getline(std::cin, s);

scanning string in c++ [duplicate]

This question already has answers here:
Why does std::getline() skip input after a formatted extraction?
(5 answers)
Closed 2 years ago.
#include<bits/stdc++.h>
using namespace std;
int main() {
int test;
cin>>test;
for(int i=0;i<test;i++){
string name;
getline(cin,name);
cout<<name<<"\n";
}
}
input
2
Pratik Patil
Niranjan shirdhone
output:
Pratik Patil
why this code not scanning string for second test case?
When using the std::cin >> test syntax, a newline is always appended at the end as soon as Enter key is pressed. The leading newline inhibits the expected functionality of your program, it follows that it must be skipped or ignored somehow.
That's why std::getline() ignores the input. You need to discard that newline character. A simple solution to that is to call std::cin.ignore() after the the first extraction:
cin >> test;
cin.ignore();
...

Function allows word but not Phrase c++ [duplicate]

This question already has answers here:
std::cin input with spaces?
(8 answers)
Closed 3 years ago.
I have a function that allows a user to input a word or phrase then display it on a menu but for some reason it will display a word but not a phrase, system crashes when I use more than one word
snippet of my function code:
string GetWord(void){
string localString = "";
cout<< "please enter a new word or phrase: ";
cin >> localString;
return localString;
}
does anyone know what I have done wrong ? the menu will display a single word but not double.
The input operator >> on std::cin stops reading at the first space and so just reads one word. This is the defined behavior.
I assume you would like to read until the user presses enter. You want to read a line. You can use std::getline() to achieve this:
std::string GetWordOrPhrase() {
std::string localString;
std::cout << "please enter a new word or phrase: ";
std::getline(std::cin, localString);
return localString;
}
BTW: Always use the std:: namespace explicitly in your code. Do not use using namespace std just to spare a few characters. (Code is not (only) about making it work with some compiler, but also a communication means between software developers.)

vector string array input size issue [duplicate]

This question already has answers here:
Why does std::getline() skip input after a formatted extraction?
(5 answers)
Closed 4 years ago.
#include<vector>
#include<iostream>
using namespace std;
int main(){
int number;
cin>>number;
string s1;
vector<string> lists;
for(int i=0;i<number;i++){
getline(cin,s1);
lists.push_back(s1);
}
for(int i=0;i<number;i++)
cout<<lists[i]<<" ";
}
When I enter 5 (for eg.) as input number, I am only able to enter 4 strings instead of 5. Can anyone help me out?
Thank you.
after the line cin>>number; there is still the newline character \n (because you pressed enter to input the value )in the input buffer, to fix this you add a line with cin.ignore();
int main(){
int number;
cin>>number;
cin.ignore(); // add this line
string s1;
vector<string> lists;
for(int i=0;i<number;i++){
getline(cin,s1);
lists.push_back(s1);
}
for(int i=0;i<number;i++)
cout<<lists[i]<<" ";
}
You are mixing line-based input (getline) and non-line-based input (cin>>number). This causes your first getline call to read an empty string into s1, because the \n in the stream has not yet been consumed.
So lists actually has 5 elements at the end, it's just that your output makes it hard to notice.
In order to prevent the problem, convert everything to line-based input instead. Replace this:
int number;
cin>>number;
With this:
std::string line;
std::getline(std::cin, line);
auto const number = std::stoi(line);
This is a superior solution anyway, because it makes it easier to detect wrong input (when the user enters something other than an integer number for number).

C++ skipping on cin.getline [duplicate]

This question already has answers here:
cin and getline skipping input [duplicate]
(4 answers)
Closed 8 years ago.
i have a problem with input char to my program
#include <iostream>
using namespace std;
int main()
{
int choise;
char word[81];
cin >> choise;
cout << "enter the word:" << endl;
cin.getline(word, 81);
return 0;
}
the visual studio open the input to "choise"
but skip on cin.getline (it the same if i replace it with gets_s).
i tried to write
cin.get(); before the "getline"...
but then the program not get's the first char
(if i put 'aa' it get 'a')
what can i do?
thanks
Its because you entered a newline for the program to accept the integer you entered for choice, the that newline is not extracted from the buffer, leaving it to be read in your next input operation. The getline call reads that left-over newline, and is happy with that.
There are a couple of ways to solve your problem. The first and most obvious is to use std::string for the word variable, and then use the normal input operator >> as that will skip leading whitespace (which includes newline).
Another solution is to tell the input stream to ignore until and including a newline. The linked reference has an example on how to do exactly that.
After entering the integer you press enter, and this enter input is left in the buffer area and used as the next input for getline and the computer assumes you're done.
add this line before getline statement and re- compile it.
cin.ignore().