c++ - C++ 中的 While 函数和 cin

标签 c++

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

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

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

最佳答案

我正在回答,因为从你的评论来看,你的问题似乎 与其他答案解决的问题不同。

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

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

>>> 运算符(它只不过是一个带有 一个特殊的名字,你将在本书后面看到)首先摘录 字符,直到找到一个不是空白的字符;然后 提取字符,直到找到一个空白字符, 将它提取的每个字符放入 dest。它还将 如果没有更多的字符要提取,则停止, 称为文件结尾的条件。如果那发生在它之前 将任何字符放入dest,输入都会失败;这 failure会被内存在stream中,会在什么时候使用 您在需要 true 或 false 的上下文中使用流: 流为真,除非失败。

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

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

std::istream::get 是一个非常非常低级的输入,它 总是只提取一个字符,不跳过白色 空间,或任何东西。 >>> 所做的就是调用这个函数 直到它完成它的任务。有点多 复杂的;特别是 >>> 通常无法知道它是否 已经完成,直到它看起来太远了一个字符,所以有 是查看下一个字符而不提取它的方法, 以及将您提取的最后一个字符推回的方法 流的前面,所以你可以再读一遍。还有 是管理错误状态的方法。 (假设你将 >>> 做成一个 int,但接下来要读取的字符是“abc”。)但是对于 此刻,你不必担心这一切。为了 时刻,请记住,一旦一个字符被读取,它就是 消失了,再也无法阅读。

关于c++ - C++ 中的 While 函数和 cin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21633606/

相关文章:

c++回调就像在java中一样

c++ - 为什么 ExposureCompensator 结果给出黑色图像?

c++ - vector 的 vector 来创建矩阵

c++ - 将文件读入struct c++数组

c++ - OpenGL 着色器不编译

c++ - 如何使用另一个 DLL 为 Qt 制作第三方插件?

c++ - 错误 : no operator "<" matches these operands

c++ - 如何使用 g++ 编译带有根库的 C++ 程序?

c++ - 压缩原始图像缓冲区

c++ - 导出两个命名空间中的重复函数 (C++)