自从我开始阅读Stroustrup的书“编程原则和实践”以来,已经过了几天。他的语法重复检测代码如下,
string previous = " ";
string current;
while (cin >> current){
if (previous == current)
cout << "repeated word:" << current << "\n";
previous = current;
}
虽然他解释了while语句,但我并不完全理解如何使用while和cin的组合来分析整个句子。如果它逐字逐句地采用句子,那么究竟是什么决定了这一点。例如,为什么不用第一个单词停止。
答案 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)
cin
是istream
模板类的实例。 operator >>
作用于此istream实例以将输入加载到数据中并返回对此istream
的引用。然后通过调用cin::operator void*()
来调试它,调用fail()
函数来测试操作是否成功。这就是你可以在条件
while ( cin >> current)
{
//...