自从我开始阅读 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/