-1
#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 次

所有这些代码都应该正常工作。很抱歉给您带来不便。(脑子放个屁)

4

2 回答 2

3

似乎按预期工作

在语句或循环std::cin >> whatever的条件下这样做是有充分理由的。提取运算符返回您正在操作的流。所以表达式的值就是它本身。ifwhile>>std::cin >> whateverstd::cin

为了检查流是否处于有效状态std::cin,可以将流(例如 )转换为。bool考虑:

if (std::cin >> whatever)

这可以理解为将用户输入到变量中whatever,然后检查输入是否有效。如果没有,该if块将不会执行。

相似地:

while (std::cin >> whatever)

这将循环,每次都从用户那里获取输入,直到用户输入无效的内容。

什么是无效输入?好吧,如果whatever在上面的示例中是一个int,并且用户输入了 text blah,这将失败,因为它不是一个有效的整数。

于 2013-03-03T17:23:01.047 回答
0

您提供的代码按预期工作。

该表达式stream >> variable产生对 的引用stream,并且作为一个if条件,然后将其转换为bool 就好像您已经编写了!(stream >> variable).fail().

然而,虽然代码在技术上有效,但它有很多冗余

因此,除非作者的目的是说明技术上不好的代码(也许讨论它的所有问题),否则它在教学上是不好的。

这是一个冗余更少的替代公式:

#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:\开发\测试]
> g++ foo.cpp

[D:\开发\测试]
>回声 42 42 42 42 42 55 55 62 100 100 100 | 一种
42 发生 5 次
55 出现 2 次
62 发生 1 次
100 出现 3 次

[D:\开发\测试]
> _
于 2013-03-03T17:57:54.470 回答