C++:接受用户输入,直到收到*两个*空行

C++: Accepting user input until *two* blank lines are received

提问人:Angela 提问时间:5/25/2021 更新时间:5/25/2021 访问量:133

问:

我正在编写与用户输入有关的代码。我想继续接收用户的输入,直到用户输入两个空行(用户连续两次点击两个空行的“返回”按钮,在第三个“返回”时,用户输入终止。

到目前为止,我的代码是:

int number_of_empty_res = 0;
string data; 

vector<string> myvec;

while (getline(cin, data) && !data.empty())
{
    
    if (data == "")
    {
        number_of_empty_res += 1;
        myvec.push_back (data+' ');

    }
  
    if (number_of_empty_res == 2)
    {

        break;
    }
    else
    {
        number_of_empty_res = 0;
        myvec.push_back (data+' ');
        
    }
    
}


for (int i = 0; i < myvec.size(); i++)
{
    
        cout << myvec[i];
    
}

我正在使用向量作为缓冲区,将每行输入推回向量中,因为我想对用户输入做一些有用的事情。我还在计算连续空行的数量。

目前,我拥有的代码在用户连续点击“返回”按钮两次后终止(即用户给我一个空行,当再次按下“返回”键时,程序结束)。我正在处理我的代码,我想如果我有两个连续的空行的“if”条件,代码就会中断,但这并没有发生......我尝试增加指定的空白数量,但似乎这实际上对代码没有影响,因为代码如前所述不断终止。我还尝试了“while”循环的条件。我认为“!data.empty()”可能是我代码中有问题的部分,但是在删除它后,用户输入似乎永远不会终止。

我感谢任何帮助和想法!谢谢!

C++ 输入 IOSTREAM

评论

2赞 Karl Knechtel 5/25/2021
当您尝试使用调试器跟踪程序的逻辑时,会发生什么情况?

答:

1赞 user15401571 5/25/2021 #1

试试这个:

int main() {
    int number_of_empty_res = 0;
    string data;

    vector<string> myvec;

    while (getline(cin, data))
    {
        if (data.empty()) {
            number_of_empty_res += 1;
            if (number_of_empty_res > 2)
            {
                break;
            }
        }
        else 
        {
            number_of_empty_res = 0;
            myvec.push_back(data + ' ');
        }

    }


    for (int i = 0; i < myvec.size(); i++)
    {

        cout << myvec[i];

    }
}

原因:如果我们查看您的循环内部,我们会看到以下内容:

    if (data == "")
    {
        number_of_empty_res += 1;
        myvec.push_back (data+' ');

    }
  
    if (number_of_empty_res == 2)
    {

        break;
    }
    else
    {
        number_of_empty_res = 0;
        myvec.push_back (data+' ');
        
    }

这里的问题是,如果还不是 2,则测试失败,因此我们意外重置。number_of_empty_resnumber_of_empty_res

注意:使用调试器应该是一个好习惯,如果还没有的话。

评论

0赞 Nick Reed 5/25/2021
小小的吹毛求疵:break 语句应该是因为 OP 需要 2 个空行,并在第三个空行处终止。if (number_of_empty_res > 2)