C++ getline method not working

倖福魔咒の 提交于 2019-12-02 13:21:13

问题


I'm sorry but I'm quite new to C++ but not programming in general. So I tried to make a simple encryption/decryption. However when I added the modification to my previous code (so there isn't two programs for encrypting and decrypting) I found that the code 'getline()' method no longer works. Instead it's just ignoring it when the code is ran. Here's the code:

int main(){
    std::string string;
    int op = 1; //Either Positive or Negative

    srand(256);
    std::cout << "Enter the operation: " << std::endl;
    std::cin >> op;
    std::cout << "Enter the string: " << std::endl;
    std::getline(std::cin, string); //This is the like that's ignored

    for(int i=0; i < string.length(); i++){
        string[i] += rand()*op; //If Positive will encrypt if negative then decrypt
    }
    std::cout << string << std::endl;

    std::getchar(); //A Pause 
    return 0;
}

回答1:


That's because std::cin >> op; leaves a hanging \n in your code, and that's the first thing getline reads. Since getline stops reading as soon as it finds a newline character, the function returns immediately and doesn't read anything more. You need to ignore this character, for example, by using cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); (std::numeric_limits is defined in header <limits>), as stated on cppreference.




回答2:


This is because you still have the newline character in the buffer which makes getline() stop reading as soon as it encounters it.

Use cin.ignore() to ignore the newline character from the buffer. This will do in your case.

In general, if you want to remove characters from your buffer untill a specific character, use:

cin.ignore ( std::numeric_limits<std::streamsize>::max(), ch )



回答3:


Use :

cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );

to eat newlines from previous input std::cin >> op;

header - <limits>

Other way would be :

    while (std::getline(std::cin, str)) //don't use string
    if (str != "")
    {
       //Something good received

        break;
    }



回答4:


As other stated already, the formatted input (using in >> value) start skipping space abd stop when they are done. Typically this results in leaving some whitespace around. When switching between formatted and unformatted input you typically want to get rid of leading space. Doing so can easily be done using the std::ws manipulator:

if (std::getline(std::cin >> std::ws, line)) {
    ...
}


来源:https://stackoverflow.com/questions/19257205/c-getline-method-not-working

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!