为什么这个循环永远不会结束?

时间:2016-09-04 13:36:44

标签: c++

所以我觉得我接近于解决一个编程分配,它占用每行最常用的单词并将其打印在一行上。例如:

enum class TEST
{
    BEGIN = __LINE__
    , ONE
    , TWO
    , NUMBER = __LINE__ - BEGIN - 1
};

auto const TEST_SIZE = TEST::NUMBER;

// or this might be better 
constexpr int COUNTER(int val, int )
{
  return val;
}

constexpr int E_START{__COUNTER__};
enum class E
{
    ONE = COUNTER(90, __COUNTER__)  , TWO = COUNTER(1990, __COUNTER__)
};
template<typename T>
constexpr T E_SIZE = __COUNTER__ - E_START - 1;

会打印:&#34;我没关系&#34; (作业中忽略标点符号和大小写)

这是我到目前为止所做的,但问题是扫描行的while循环永远不会终止,因此永远不会在外部for循环中打印输出。有人看到我哪里出错了吗?

I am a man, am right?
I don't know if i like that.
It's okay to not feel okay.

2 个答案:

答案 0 :(得分:2)

你的循环正如写的那样;你只是不知道如何表示输入的结束。你正坐在那里等待程序进展,但程序正坐在那里等着你给它更多的输入。

按Ctrl + D(Linux)或Ctrl + Z(Windows)发送EOF字符/信号/药水以结束循环。

这样,所有常见的shell技术,如文件重定向和管道也都可以。

引入像双线或者一些魔术命令之类的人为手段是非传统的,会使你的程序更难自动化。 (并且让你的程序神奇地知道其中一个换行来自键盘命中而不是复制/粘贴,这是不可能的。你也不想这样做!这打破了大量有价值的抽象。)当写一个命令时 - 线工具,尽可能坚持标准做法。

答案 1 :(得分:1)

目前您的程序正在等待表明输入已结束的EOF字符。如果您正在运行此命令并从命令行输入输入,则可以通过按* nix上的Ctrl + D或Windows上的Ctrl + Z手动插入EOF。这将导致您的程序脱离getline循环。

如果您不想这样做,则需要一种方法来摆脱getline循环,否则它将继续在该循环中运行。

一个好主意可能是检测到一个空行,因此按两次回车键结束循环:

while(getline(cin,line)){     //on each line
    if(line == "")
        break;
    ...
}