行为C ++时可能出乎意料(可能与IDE有关)

时间:2015-10-14 00:46:09

标签: c++ visual-studio while-loop visual-studio-2015

我正在编写一个非常简单的程序来计算和显示输入序列中连续整数的数量(这是一个练习自己关于while循环和条件的练习)。代码如下:

#include "stdafx.h" //obviously using VS
#include <iostream>

int main()
{
    int currVal = 0, val = 0;
    if (std::cin >> currVal) {
        int cnt = 1; //number of consecutive values
        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;
}

在最后一个cout行中,我考虑了应该退出while循环而不打印最后一个值的eof行为。但是,在VS 2015中,最后一行没有被打印,而while循环显然没有终止,尽管cnt不再递增。控制台继续运行并接受更多输入,如果我输入另一个值或非整数,它将实际返回最后一个值。最终的控制台如下所示:

Console

还有另一个输入:

Console 2

然而,当我在像Ideone这样的在线编译器中运行相同的代码时,结果是正确的并且循环终止。 http://ideone.com/mUZuh7

Ideone

这是Visual Studio的一些不寻常的行为,还是我的代码中有一些明显的初学者错误,我忽略了。

由于

2 个答案:

答案 0 :(得分:1)

不,它是在线编译器中的异常行为。

我假设在线编译器的标准输入只会读到行结束,而正常的C ++程序将读取直到文件结尾(无效输出或结束 - 使用了文件的快捷方式),因为while循环的条件在结束时 1 2 3 4 4 不是假的。要解决您的问题,您必须一次读取一行(您还没有学习如何做我假设),或者等待输出任何内容,只需将信息保存到容器并输出最后的一切(你还要学习)。

我无法以你理解的方式给你一个解决方案。暂时忽略这个bug,一旦你对标准I / O的工作方式有了更多的了解,你就可以修复bug。

抱歉,我可以提供更多帮助。

答案 1 :(得分:1)

您的代码中存在错误,TeamEnternode points out in their answer Ideone的行为异常。

当有while字符要读取时,您的std::cin循环会继续处理;但是,在读取最后一个4之后,它会递增cnt并且不会输出任何内容(根据您的if语句)。当while循环接下来评估std::cin时,它就再也没有了!

如果您没有以双精度结束输入(例如1 2 3 4 4 5),您的代码可能会像您预期的那样工作。

以下是您的代码正在执行的操作(假设输入为1 2 3 4 4):

  1. if (std::cin >> currVal):等待来自std::cin的输入。您需要在控制台中输入内容并按Enter键才能通过此操作。
  2. currVal等于1,并且是您输入的第一个字母。
  3. while (std::cin >> val)std::cin读取另一个角色。这将显示为2val现在为2
  4. if (val == currVal)1不等于2,因此您的代码会输出1的出现次数,并将currVal更改为2
  5. while (std::cin >> val)std::cin读取另一个角色。这将显示为3val现在为3
  6. if (val == currVal)2不等于3,因此您的代码会输出2的出现次数,并将currVal更改为3
  7. while (std::cin >> val)std::cin读取另一个角色。这将显示为4val现在为4
  8. if (val == currVal)3不等于4,因此您的代码会输出3的出现次数,并将currVal更改为4
  9. while (std::cin >> val)std::cin读取另一个角色。这将读取另一个4val将保留为4
  10. if (val == currVal)4 等于4,因此cnt会增加
  11. while (std::cin >> val)没有任何内容可以从std::cin中读取。
  12. 如果您输入另一个不同的字符(例如5),while循环将继续,评估5 != 4然后输出4次出现并设置{{1到currVal。然后它会再次尝试5循环;但是,输入再次为空。

    Visual Studio正确运行代码。