您创建一个无限循环:
while (text != '\n') {
...
}
如果text
(对一个字符有点用词不当)碰巧与 '\n' 不同,它将永远持续下去。作为一般准则,每当您创建循环时,您都需要验证循环体是否以某种方式在循环结束时取得进展并且到达循环结束(当然,除非您打算创建一个无限lop)你可能只是想摆脱它while (...)
,只保留身体。
请注意,外部循环应该有两个终止条件:
- 如果您到达一行的末尾,它应该终止。
- 如果您到达输入的末尾,它应该终止:这不一定由换行符终止。
如果我要编写循环,它看起来像这样:
for (std::istreambuf_iterator<char> it(std::cin), end; it != end && *it != '\n'; ++it) {
// do something with the `char` obtained from `*it`
}
还值得注意的是,您需要确保将正值传递给islower()
(或来自 的任何其他函数<cctype>
):有些系统char
已签名,例如,ü
以我的名义将转换为负值,导致调用时未定义的行为islower('ü')
。避免这个问题的方法是在将其传递给函数之前将其转换char
为an :的位模式与(假设是类型)的位模式相同。unsigned char
<cctype>
static_cast<unsigned char>(c)
c
c
char
坚持使用while
-loop 读取 a的原始方法char
,基本循环看起来像这样:
while (std::cin.get(text) && text != '\n') {
if (std::islower(std::static_cast<unsigned char>(text))) {
++count;
}
}
一般来说,我发现-loops 很少不会在生产代码中存活下来,这也不例外:如果可以成功读取do ... while
,您只想进入循环。char
由于换行符不是小写字母,因此也可以直接放入条件中。对于 ASCII 字符std::islower(text)
可以工作,但为了使代码更可靠,我添加了一个演员表以unsigned char
确保事情不会中断。最后,具有讽刺意味的是,增加变量的 C++ 习语是预增量,++count
而不是count++
. 主要用途是,如果应用它的类型不完全是微不足道的,那么它会更有效。由于 C++ 使用大量递增的迭代器,因此通常使用预递增。