读取输入并检查它是否以两个换行结束

时间:2014-07-07 14:44:13

标签: c++ file loops stream

如果用户按两次返回键,我正在编写一个消息完成的程序。检查(按照规定)的方法是检查是否已经读取了两个连续的'\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 ++的新手) 在此先感谢:)

3 个答案:

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