1

对不起,我对 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;
}
4

5 回答 5

7

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

于 2013-10-08T20:04:26.910 回答
4

这是因为缓冲区中仍然有换行符getline(),一旦遇到它就会停止读取。

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

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

cin.ignore ( std::numeric_limits<std::streamsize>::max(), ch )
于 2013-10-08T20:03:57.387 回答
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;
    }
于 2013-10-08T20:04:06.277 回答
2

如前所述,格式化的输入(使用in >> value)在完成后开始跳过空格 abd stop。通常这会导致留下一些空白。在格式化和未格式化输入之间切换时,您通常希望摆脱前导空格。使用操纵器可以轻松完成此std::ws操作:

if (std::getline(std::cin >> std::ws, line)) {
    ...
}
于 2013-10-08T20:13:50.857 回答
-1

您必须使用std::cin.ignore()beforestd::getline(std::cin, string)清除缓冲区,因为当您std::cin >> op在 getline 之前使用时,a\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;
}
于 2021-06-22T13:50:09.630 回答