如果用户按两次返回键,我正在编写一个消息完成的程序。检查(按照规定)的方法是检查是否已经读取了两个连续的'\n'
次出现。我很困惑如何做到这一点。在How do I store a previous iteration in a while loop in C++?
我有一些想法并且这样做了:
for(new_advice; getline(cin, new_advice);) {
if(new_advice.substr(new_advice.length()-2,2).compare("\n\n") == 0) {
outstream<<endl;
outstream<<advice;
}
}
我收到一个错误和警告。 错误是:
libc ++ abi.dylib:以std :: out_of_range类型的未捕获异常终止:basic_string
警告是
表达式结果未使用(表达式为new_advice)
我该怎么办?文件和流有点令人困惑(我是C ++的新手) 在此先感谢:)
答案 0 :(得分:0)
for (std::string new_advice; std::getline(std::cin, new_advice);)
{
if ('\n' == std::cin.peek()) {
// Two consecutive new line characters. Do something with new_advice.
std::cin.ignore();
}
}
答案 1 :(得分:0)
如何使用例如std::string::rfind
?
if (new_advice.rfind("\n\n") == new_advice.size() - 2)
{
// Last two characters were newlines
}
答案 2 :(得分:0)
getline
从给定流中读取一行并将其存储在第二个参数中给出的变量中。它覆盖给定变量的内容。此外,它不将换行符放入变量中。这意味着,您在字符串中找不到两个换行符,甚至没有找到一个换行符。
当用户两次点击返回键时,C ++应用程序会读取两行,其中第二行是空的。
您应该通过检查读取行是否为空来检测该情况。如果是这种情况,这意味着用户只是第二次点击返回键,以前读取字符串是他的实际输入。这意味着您需要将输入存储在不同的字符串变量中,以使getline
不会覆盖您的变量。
这样的事情:
string new_advice;
string input;
while (getline(cin, input)) {
if (input.empty()) {
// Do something with new_advice
}
else {
// Remember input for the case where the user hits return key again
new_advice = input;
}
}