std::getline does not work inside a for-loop
c++, getline
Solution
You can see why this is failing if you output what you stored in `local` (which is a poor variable name, by the way :P):
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
string local;
getline(cin, local);
std::cout << "> " << local << std::endl;
}
//............................
return 0;
}
You will see it prints a newline after `>` immediately after inputting your number. It then moves on to inputting the rest.
This is because `getline` is giving you the empty line left over from inputting your number. (It reads the number, but apparently doesn't remove the `\n`, so you're left with a blank line.) You need to get rid of any remaining whitespace first:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
cin >> ws; // stream out any whitespace
for(int i = 0; i < n; i++)
{
string local;
getline(cin, local);
std::cout << "> " << local << std::endl;
}
//............................
return 0;
}
This the works as expected.
Off topic, perhaps it was only for the snippet at hand, but code tends to be more readable if you don't have `using namespace std;`. It defeats the purpose of namespaces. I suspect it was only for posting here, though.
Problem
I'm trying to collect user's input in a string variable that accepts whitespaces for a specified amount of time. Since the usual `cin >> str` doesn't accept whitespaces, so I'd go with std::getline from <string> Here is my code: ``` #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { int n; cin >> n; for(int i = 0; i < n; i++) { string local; getline(cin, local); // This simply does not work. Just skipped without a reason. //............................ } //............................ return 0; } ``` Any idea?