我很抱歉,但我对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;
}
答案 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;
}