std :: getline(),而循环内容未运行

时间:2015-09-07 18:33:40

标签: c++ loops while-loop g++ std

目标

<小时/> c ++的新手并没有在其他任何地方找到关于这个问题的明确答案。我正在研究一个简单的程序,该程序从控制台内部读取用户输入的消息。这是使用字符串变量/连接的练习。

我需要创建读取用户输入的循环,该循环可能包含来自命令shell的多行输入。

因此我的功能需要读取该输入,同时忽略换行符,并在用户输入两个&#34;&amp;&amp;&#34;在一条新线上。

尝试

<小时/> 所以这是我的功能:

string get_message() {
    string message, line;
    cout << "Enter the message > ";
    cin.ignore(256, '\n');
    while (getline(cin, line) && line != "&&") {
        message = message + " " + line;
        cout << message;
        cin.clear();
    }
    return message;
}

我遇到的问题是在while循环中,在找到&&之前,循环内容似乎没有运行。我cout << message时的含义我只得到前一行输入。

样本运行

Enter the Message >  Messages.. this is a new message.
I'm a message on a new line, look at me.
New line.
&&
"New line." <--- from console cout

Result: New line.

的问题:

  • 何时调用循环内容?
  • 为什么我只获得前一行而不是以前所有(据称)连接的行?
  • 有更好的方法来编码吗?

1 个答案:

答案 0 :(得分:2)

打破这个局面:

string get_message() {
    string message, line;
    cout << "Enter the message > ";

标准的东西。这没东西看。继续前进。

    cin.ignore(256, '\n');

丢弃第一行或256个字符,以先到者为准。可能不是你想做的。在意识形态上,如果您认为流中可能存在废话,请在调用函数之前清空流。无论如何,肯定是OP问题的一部分。

    while (getline(cin, line) && line != "&&") {

虽然成功获得了一行AND行不是“&amp;&amp;”。看起来不错。注意:新行被getline函数剥离,因为它们是令牌分隔符并将它们留在返回的令牌中或将它们留在流中只会导致问题。

        message = message + " " + line;

在信息附加行

        cout << message;

将消息写入输出。没有刷新,所以当消息进入屏幕时是不可预测的。这可能是OP问题的一部分原因。

        cin.clear();

清除cin上的错误情况。不需要。如果cin处于错误状态,则while循环将不会进入。

    }
    return message;
}

正常的东西。这里没有什么可看的,但是如果程序在此之后不久结束,则会调用cout.flush(),{cn}将被发送到cout,或者有std::flush,cout将被刷新并且消息会突然出现。

所以,使用OP的输入:

cout << endl;

这被Messages.. this is a new message.

消除了
cin.ignore

最终应该出现。不知道为什么OP没有看到它。我无法重现。

I'm a message on a new line, look at me.

最终应该出现。

New line.

结束输入。

输出应为:

&&

我很难过为什么OP在第一次刷新时没有得到这个。正如我所说,无法重现。

返回应该是:

I'm a message on a new line, look at me. I'm a message on a new line, look at me. New line.