C++ 而C+中的函数和cin+;

C++ 而C+中的函数和cin+;,c++,C++,自从我开始阅读Stroustrup的书《编程原则和实践》以来,已经有几天了。他的语法重复检测代码如下: string previous = " "; string current; while (cin >> current){ if (previous == current) cout << "repeated word:" << current << "\n"; previous = current; } st

自从我开始阅读Stroustrup的书《编程原则和实践》以来,已经有几天了。他的语法重复检测代码如下:

string previous = " ";
string current;
while (cin >> current){
    if (previous == current)
        cout << "repeated word:" << current << "\n";
    previous = current;
}
string-previous=”“;
串电流;
而(cin>>当前){
如果(先前==当前)

试着像算法一样思考:

While the text isn t complete
    read a word
    if this word is like the previous one
        there s a repeated word
    store this word for next iteration

while(cin>>current)
会一个接一个地发送一个单词,直到cin为空。

尝试将其视为算法:

While the text isn t complete
    read a word
    if this word is like the previous one
        there s a repeated word
    store this word for next iteration

while(cin>>current)
将一个字接着一个字发送,直到cin为空。

答案非常简单

while (cin >> current)

读取输入,直到里面什么都没有。标准重载的
运算符>>
跳过空白,然后读取所有内容,直到遇到另一个空白字符或到达输入的末尾。由于它位于
while
循环中,因此在循环的每次迭代中都会调用它。这就是为什么这个句子答案很简单

while (cin >> current)

读取输入,直到里面什么都没有。标准重载的
运算符>>
跳过空白,然后读取所有内容,直到遇到另一个空白字符或到达输入的末尾。由于它位于
while
循环中,因此在循环的每次迭代中都会调用它。这就是为什么这个句子被拆分为单词。

简单地说,它将读取单词,直到没有单词为止!一旦到达输入的末尾,或者遇到非字符串(好吧,祝您好运),在流上设置了一个错误标志。
cin>>current
的计算结果为
cin
,设置错误标志后,该值可以转换为布尔值
false
。由于您使用
cin>>current
作为循环条件,这将结束循环。

简单地说,它将读取字,直到没有字为止!一旦inp结束到达ut,或者遇到非字符串(好吧,祝您好运),在流上设置了一个错误标志。
cin>>current
的计算结果为
cin
,设置错误标志后,该值又可以转换为布尔值
false
。由于您使用
cin>>current
作为循环条件,因此循环结束。

cin
istream
模板类的一个实例。
operator>>
操作此istream实例以将输入加载到数据中,并返回对此
istream
的引用。然后通过调用
cin::operator void*()
对其进行测试,调用
fail()
函数来测试操作是否成功。这就是为什么可以在while条件下使用此操作的原因

while ( cin >> current)
{
   //...

cin
istream
模板类的一个实例。
operator>
作用于这个istream实例,将输入加载到数据中,并返回对这个
istream
的引用。然后通过调用
cin::operator void*()
来测试它
用于测试操作是否成功的函数。这就是为什么可以在while条件下使用此操作的原因

while ( cin >> current)
{
   //...

我在回答,因为从你的评论来看,你的问题似乎 与其他答案所涉及的问题不同

std::istream
是一个流;在 (C++)也可以用于某些非顺序的形式。 输入,但这是一个高级功能,使用起来很棘手,而且 在这里不需要关心我们。)的重要方面 顺序输入或流是它从中提取数据的过程 它的来源,一旦数据被提取出来,它就不再是 从逻辑上讲,它可以被认为是 将位置标记插入文件中的数据中;每次 提取一个字符,位置标记前进,然后 始终在位置标记处提取。因此,当您写入时:

std::string dest;
std::cin >> dest;
>
运算符(它只不过是一个具有 一个特殊的名字,你将在本书后面看到)第一段摘录 字符,直到找到一个不是空白的字符;然后 提取字符,直到找到一个空白字符, 将它提取的每个字符放入
dest
。它还将 如果没有更多要提取的字符,请停止, 一种称为文件结束的条件。如果在文件结束之前发生这种情况 将任何字符放入
dest
,输入将失败;此 故障将被存储在流中,并在以下情况下使用: 在需要true或false的上下文中使用流: 除非流失败,否则该流为真

但需要保留的重要一点是,这条流永远不会消失 提取相同字符两次。如果要查看此 更好的是,流有一些低级函数,允许您 要提取数据,请逐个字符。您可能需要 尝试:

charch;
while(std::cin.get(ch)){
std::cout
是否调用此函数 直到它完成它的任务。它是一个多一点 复杂;尤其是,
>
通常无法知道 已经完成,直到它看起来有一个字符太远,所以有 是指偷看下一个字符,而不提取它, 还有一种将你提取的最后一个角色推回的方法 在溪流的前面,这样你就可以再看一遍了 是管理错误状态的方法。(假设您在
int
,但是接下来要读取的字符是“abc”。)但是 现在,你不必担心所有这些。现在 现在,只要记住,一旦一个字符被读过,它就是
消失了,再也看不见了。

我在回答,因为从你的评论来看,你的问题似乎已经解决了 与其他答案所涉及的问题不同

std::istream
是一个流;在 (C++)也可以用于某些非顺序的形式。 输入,但这是一个高级功能,使用起来很棘手,而且 在这里不需要关心我们。)的重要方面 顺序输入或流是它从中提取数据的过程 它的