C ++ getline方法不起作用

时间:2013-10-08 20:01:54

标签: c++ encryption cin

我很抱歉,但我对C ++很陌生,但不是一般的编程。所以我试着做一个简单的加密/解密。但是,当我将修改添加到我之前的代码中时(因此没有两个加密和解密程序),我发现代码'getline()'方法不再有效。相反,它只是在代码运行时忽略它。这是代码:

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;
}

5 个答案:

答案 0 :(得分:7)

这是因为std::cin >> op;在代码中留下了\n,这是getline读取的第一件事。由于getline在找到换行符后立即停止读取,因此该函数立即返回并且不再读取任何内容。您需要忽略此字符,例如,使用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');std::numeric_limits在标头<limits>中定义),如cppreference所述。

答案 1 :(得分:4)

这是因为缓冲区中仍然有换行符,这会使getline()在遇到它时立即停止读取。

使用cin.ignore()忽略缓冲区中的换行符。这将适用于你的情况。

通常,如果要从缓冲区中删除字符直到特定字符,请使用:

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

答案 2 :(得分:3)

使用:

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

从以前的输入std::cin >> op;

中获取换行符

标题 - <limits>

其他方式是:

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

        break;
    }

答案 3 :(得分:2)

正如其他已经说明的那样,格式化的输入(使用in >> value)开始跳过空格abd完成后停止。通常这会导致留下一些空白。在格式化和未格式化输入之间切换时,您通常希望摆脱前导空间。这样做可以使用std::ws操纵器轻松完成:

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

答案 4 :(得分:-1)

您必须在 std::cin.ignore() 之前使用 std::getline(std::cin, string) 来清除缓冲区,因为当您在 getline 之前使用 std::cin >> op 时,\n 会进入缓冲区,而 std::getline()阅读它。 std::getline() 只接受您键入的行,当您跳过一行时,std::getline() 关闭,因此当 std::getline() 从缓冲区中获取 \n 时,它在您键入内容之前已经终止,因为 /n 跳过了一行。

试试这个方法:

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::cin.ignore();
    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;
}