#include <iostream>
int main()
{
int currVal = 0, val = 0;
if (std::cin >> currVal) {
int cnt = 1;
while (std::cin >> val) {
if (val == currVal)
++cnt;
else
{
std::cout << currVal << " occurs " << cnt << " times" << std::endl;
currVal = val;
cnt = 1;
}
}
std::cout << currVal << " occurs " << cnt << " times" << std::endl;
}
return 0;
}
如果我们为此程序提供以下输入:
42 42 42 42 42 55 55 62 100 100 100
然后输出应该是
42次发生5次
55次发生2次
62次发生1次
100次发生3次
所有这些代码都应该正常运行。很抱歉给您带来不便。(有一个脑屁)
答案 0 :(得分:3)
有一个很好的理由在std::cin >> whatever
语句或if
循环的条件下执行while
。提取运算符>>
返回您正在操作的流。因此std::cin >> whatever
表达式的值本身为std::cin
。
为了检查流是否处于有效状态,可以将诸如std::cin
之类的流转换为bool
。考虑:
if (std::cin >> whatever)
这可以理解为将用户的输入转换为变量whatever
,然后检查输入是否有效。如果不是,if
块将不会执行。
类似地:
while (std::cin >> whatever)
这将循环,每次从用户输入,直到用户输入无效的内容。
什么是无效输入?好吧,如果以上示例中的whatever
为int
,并且用户输入了文本blah
,则会失败,因为它不是有效的整数。
答案 1 :(得分:0)
您提供的代码按预期工作。
表达式stream >> variable
生成对stream
的引用,并且作为if
条件,然后将其转换为bool
,就好像你一样曾写过!(stream >> variable).fail()
。
然而,虽然代码在技术上有效,但它有很多冗余
所以,除非作者的观点是要说明技术上的ungood代码(也许是对它的所有错误进行讨论),否则这是教学上不合时宜的。
这是一种备用配方,冗余度更低:
#include <iostream>
using namespace std;
int main()
{
int current_value = 0;
int run_length = 0;
for( bool at_end = false; !at_end; )
{
int value;
at_end = (cin >> value).fail();
if( run_length > 0 && (at_end || value != current_value) )
{
cout << current_value << " occurs " << run_length << " times" << endl;
run_length = 0;
}
if( !at_end )
{
if( run_length == 0 )
{
current_value = value;
}
++run_length;
}
}
}
测试:
[D:\dev\test] > g++ foo.cpp [D:\dev\test] > echo 42 42 42 42 42 55 55 62 100 100 100 | a 42 occurs 5 times 55 occurs 2 times 62 occurs 1 times 100 occurs 3 times [D:\dev\test] > _