2014-09-28 81 views
0

在我进行一个非常简单的编程练习之前,我遇到了输入结束符的问题。我写这个程序来检查,如果两个词在文中repetead:结束输入字符不起作用

string previous = ""; //initalized to "not a word" 
string current;  //current word 
while (cin >> current) { //input operation 
if (previous == current) // check if the word is the same as last 
cout << "repetead words : " << current << '\n'; 
previous = current; 
} 

cout << previous << "\n" << current << "\n"; 

我的书上说的,如果我要终止输入操作,并跌出while循环我必须插入结束输入的字符,但是,如果我将这个字符插入到我的输入单词的同一行中,我将不会掉到循环中。只要将它插入换行符,它就可以工作。为什么?我必须在换行符中插入输入结束字符才能使其工作?

+3

无论您使用的是Linux终端还是Windows命令窗口,它都是如何工作的,如果您希望程序是可移植的并且只使用标准C++,那么您可以做的事情就不多了。 – 2014-09-28 16:35:01

回答

-1

std::cin::operator>>将返回false而不是在达到流尾时对std::cin的另一个引用。传递一个单独的eof是一种表示流结束的方式。

std::cin仅解析eof时,它专门解释它,而不是考虑更多数据流中的数据。如果它解析任何与eof相结合的数据,则它仅被视为数据流中的数据。

+0

'std :: cin :: operator >>'* always *返回对流的引用。如果数据流到达文件结尾并且无法读取数据,那么该流的隐式调用的布尔运算符将返回false。此外,我不知道你的意思是流解析*只* eof。 – 0x499602D2 2014-09-28 17:25:15

+0

@ 0x499602D2据我所知,* eof *位没有设置在流中传递任何附加数据时的状态。因此,例如,如果它读取'x y x * eof *',* eof *位将不会被设置。虽然,如果它读取'* eof *',* eof *位将设置为状态(表示流结束)。 – Jason 2014-09-28 17:43:12

+1

eof位*被设置。但是直到读取失败才会停止循环。这是因为布尔运算符只检查'!fail()'。 – 0x499602D2 2014-09-28 17:58:25