繁体   English   中英

行为C ++时发生意外(也许与IDE相关)

[英]Unexpected while behavior C++ (perhaps IDE related)

我正在编写一个非常简单的程序,以计算和显示输入序列中连续整数的数量(这是一个用来教自己关于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行中,我说明了eof行为,该行为应退出while循环而不显示最后一个值。 但是,在VS 2015中,不会打印最后一行,尽管cnt不再递增,while循环显然也不会终止。 控制台将继续运行并接受其他输入,如果我输入另一个值或非整数,则该控制台实际上将返回该最后一个值。 最终的控制台如下所示:

安慰

并用另一个输入:

控制台2

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

Ideone

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

谢谢

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

我假设在线编译器的标准输入将只读取到该行的结尾,而普通的C ++程序将读取直到文件结束(使用了无效的输出或文件结束的快捷方式),因为1 2 3 4 4末尾的while循环条件不为假。 要解决您的问题,您将不得不一次读取一行(您尚未学习该假设),或者等待输出所有内容,然后将信息保存到容器中,然后输出所有内容最后(您还需要学习)。

我真的无法以您会理解的方式为您提供修复。 暂时暂时不考虑该错误,一旦您了解了标准I / O的工作原理,便可以修复该错误。

抱歉,我帮不上忙。

您在代码中犯了一个错误,并且正如TeamEnternode在他们的答案中指出的那样,这对于Ideone来说是不正常的行为。

当有字符要从std::cin读取时,您的while循环继续处理; 但是,在读取最后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读取了另一个字符。 这将读取另一个4 ,而val将保持为4
  10. if (val == currVal) 4 等于4 ,所以cnt递增
  11. while (std::cin >> val)std::cin不再需要阅读。

如果输入另一个不同的字符(例如5 ),则while循环将继续,计算5 != 4 ,然后输出4 s次出现并将currVal设置为5 然后它将再次尝试while循环; 但是,输入再次为空。

Visual Studio正在正确运行代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM