而C ++中的Function和cin

时间:2014-02-07 17:00:33

标签: c++

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

string previous = " ";
string current;
while (cin >> current){
    if (previous == current)
        cout << "repeated word:" << current << "\n";
    previous = current;
}

虽然他解释了while语句,但我并不完全理解如何使用while和cin的组合来分析整个句子。如果它逐字逐句地采用句子,那么究竟是什么决定了这一点。例如,为什么不用第一个单词停止。

5 个答案:

答案 0 :(得分:3)

我正在回答,因为从您的评论来看,您的问题似乎就出现了 与其他答案所解决的问题不同。

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

std::string dest;
std::cin >> dest;

>>运算符(除了函数之外的其他函数) 一个特殊的名字,正如你将在本书的后面看到的)第一个摘录 字符,直到找到一个不是空格的字符;然后 提取字符直到找到一个是空白的字符, 将它提取的每个字符放入dest。它也会 如果没有更多字符要提取,请停止 一种称为文件结束的条件。如果这发生在它之前 将任何字符放入dest,输入将失败;这个 失败将记录在流中,并将在何时使用 您在需要true或false的上下文中使用流: 除非失败,否则该流为真。

但保留的重点是流不会 两次提取相同的字符。如果你想看到这个 更好的是,流有一些低级功能,允许你 逐个字符地提取数据。你可能想要 尝试:

char ch;
while ( std::cin.get( ch ) ) {
    std::cout << ch << std::endl;
}

std::istream::get是非常非常低级别的输入 总是只提取一个字符,而不会跳过白色 空间或任何东西。所有>>都会调用此函数 直到它完成任务。它多一点 复杂;特别是>>经常无法知道它是否存在 已经完成,直到看到一个角色太远,所以那里 意味着偷看下一个角色而不提取它, 以及将你提取出的最后一个角色推回去的方法 流的前面,所以你可以再读一遍。那里 是管理错误状态的方法。 (假设您>>进入 int,但接下来要读的字符是“abc”。)但是 那一刻,你不必担心这一切。为了 那一刻,只要记住一旦一个角色被读过,那就是了 走了,永远不能再读了。

答案 1 :(得分:1)

答案很简单。

while (cin >> current)

读取输入,直到内部没有任何内容。标准重载operator>>跳过空格,然后读取所有内容,直到遇到另一个空格字符或到达输入的末尾。因为它在while循环内部,所以它将在循环的每次迭代中被调用。这就是为什么句子用文字分割。

答案 2 :(得分:0)

尝试将其视为算法:

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为空。

答案 3 :(得分:0)

简单地说,它会读到单词,直到没有任何单词为止!一旦到达输入的结尾,或遇到非字符串(好吧,祝你好运),在流上设置错误标志cin >> current计算为cin,当设置错误标志时,false可以转换为布尔cin >> current。由于您使用{{1}}作为循环条件,因此结束循环。

答案 4 :(得分:0)

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

中使用此操作的原因
while ( cin >> current)
{
   //...