[英]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循环显然也不会终止。 控制台将继续运行并接受其他输入,如果我输入另一个值或非整数,则该控制台实际上将返回该最后一个值。 最终的控制台如下所示:
并用另一个输入:
但是,当我在Ideone这样的在线编译器中运行相同的代码时,结果是正确的,并且循环终止。 http://ideone.com/mUZuh7
这是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
):
if (std::cin >> currVal)
:等待std::cin
输入。 您将需要在控制台中输入一些内容,然后按Enter键以克服此问题。 currVal
等于1
,是您输入的第一个字母。 while (std::cin >> val)
从std::cin
读取了另一个字符。 这将显示为2
: val
现在为2
。 if (val == currVal)
: 1
不等于2
,因此您的代码输出出现的1
,并将currVal
更改为2
。 while (std::cin >> val)
从std::cin
读取了另一个字符。 这将显示为3
: val
现在为3
。 if (val == currVal)
: 2
不等于3
,因此您的代码输出出现的2
,并将currVal
更改为3
。 while (std::cin >> val)
从std::cin
读取了另一个字符。 这将显示为4
: val
现在为4
。 if (val == currVal)
: 3
不等于4
,因此您的代码输出出现的3
,并将currVal
更改为4
。 while (std::cin >> val)
从std::cin
读取了另一个字符。 这将读取另一个4
,而val
将保持为4
。 if (val == currVal)
4
是等于4
,所以cnt
递增 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.