std::getline does not work inside a for-loop

后端 未结 9 2164
醉话见心
醉话见心 2020-12-15 10:28

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 does

相关标签:
9条回答
  • 2020-12-15 11:01

    On which compiler did you try this? I tried on VC2008 and worked fine. If I compiled the same code on g++ (GCC) 3.4.2. It did not work properly. Below is the versions worked in both compilers. I dont't have the latest g++ compiler in my environment.

    int n;
    cin >> n;
    string local;
    getline(cin, local); // don't need this on VC2008. But need it on g++ 3.4.2. 
    for (int i = 0; i < n; i++)
    {
        getline(cin, local);
        cout << local;
    }
    
    0 讨论(0)
  • 2020-12-15 11:05

    The important question is "what are you doing with the string that gives you the idea that the input was skipped?" Or, more accurately, "why do you think the input was skipped?"

    If you're stepping through the debugger, did you compile with optimization (which is allowed to reorder instructions)? I don't think this is your problem, but it is a possibility.

    I think it's more likely that the string is populated but it's not being handled correctly. For instance, if you want to pass the input to old C functions (eg., atoi()), you will need to extract the C style string (local.c_str()).

    0 讨论(0)
  • 2020-12-15 11:06

    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.

    0 讨论(0)
提交回复
热议问题