我正在为一个编程类编写一个代码,该代码接收多年的列表,然后显示它们是否是闰年。当我运行代码时,在输入年份列表并点击返回后,文件崩溃。
#include <iostream>
#include <cstdlib>
#include <vector>
int main(void)
{
std::vector<int> years;
int c = 0;
int i;
int x = 1;
std::cout<< "Enter a space separated list of years (enter a negative number to stop)"<<std::endl;
while(x>0)
{
if(x<=0)
{
break;
}
std::cin>> x;
years[c] = x;
c++;
}
for(i=0; i<=years.size(); i++)
{
if((years[i] % 4 == 0 && years[i] % 100 != 0) || (years[i] % 400 == 0))
{
std::cout<< years[i] << " is a leap year" << std::endl;
}else{std::cout<< years[i] << " is not a leap year" << std::endl;}
}
return 0;
}
答案 0 :(得分:3)
years
的声明会创建一个空矢量。因此,行
years[c] = x;
不对。它使用越界索引访问years
。使用
years.push_back(x);
读取数据并检测到其停止时间的逻辑是错误的。
std::cin>> x;
years[c] = x;
有两个问题。
x
添加到years
之前,它不会检查x
的值是否大于0。while(std::cin >> x)
{
if(x<=0)
{
break;
}
years.push_back(x);
}
的数据读取是否成功。它假定它是成功的。将阅读代码更改为:
while
您可以将检查结合到while ( (std::cin >> x) && ( x > 0 ) )
{
years.push_back(x);
}
语句的条件中。
years
当您在循环中使用i <= years.size()
时,您正在编写的项目多于i < years.size()
所持有的项目。它必须是for ( size_t i = 0; i < years.size(); i++)
{
if((years[i] % 4 == 0 && years[i] % 100 != 0) || (years[i] % 400 == 0))
{
std::cout<< years[i] << " is a leap year" << std::endl;
}
else
{
std::cout<< years[i] << " is not a leap year" << std::endl;
}
}
。
db/data
答案 1 :(得分:0)
为了补充R Sahu在第一部分的答案,底部的for
循环索引不正确。您试图在分配的vector
数组的末尾访问一个,这就是您获得随机数和随机输出的原因。 (从技术上讲,它会导致未定义的行为。)
这是您之前的代码:
for(i=0; i<=years.size(); i++)
{
if((years[i] % 4 == 0 && years[i] % 100 != 0) || (years[i] % 400 == 0))
{
std::cout<< years[i] << " is a leap year" << std::endl;
} else {
std::cout<< years[i] << " is not a leap year" << std::endl;
}
}
条件中的<=
具有从0到years.size()
的循环迭代,但是您可以访问的索引是0,直到years.size()-1
。要解决此问题,请执行以下操作:
for(i=0; i<years.size(); i++)
{
if((years[i] % 4 == 0 && years[i] % 100 != 0) || (years[i] % 400 == 0))
{
std::cout<< years[i] << " is a leap year" << std::endl;
} else {
std::cout<< years[i] << " is not a leap year" << std::endl;
}
}
现在它应该停在-1。