C++ While循环导致文件崩溃
我正在为一个编程类编写一个代码,该类将获取一个年份列表,然后显示它们是否为闰年。当我运行代码时,在输入年份列表并点击return后,文件崩溃C++ While循环导致文件崩溃,c++,while-loop,crash,C++,While Loop,Crash,我正在为一个编程类编写一个代码,该类将获取一个年份列表,然后显示它们是否为闰年。当我运行代码时,在输入年份列表并点击return后,文件崩溃 #include <iostream> #include <cstdlib> #include <vector> int main(void) { std::vector<int> years; int c = 0; i
#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;
}
#包括
#包括
#包括
内部主(空)
{
病媒年;
int c=0;
int i;
int x=1;
std::coutProblem 1
年的声明创建了一个空向量
years[c] = x;
不正确。它使用越界索引访问年份
。使用
years.push_back(x);
问题2
读取数据并检测到该停止的逻辑是错误的
std::cin>> x;
years[c] = x;
有两个问题
将x
的值添加到years
之前,它不会检查该值是否大于0
它不检查向x
读取数据是否成功。它假定读取成功
将读取代码更改为:
while(std::cin >> x)
{
if(x<=0)
{
break;
}
years.push_back(x);
}
问题3
当你使用i来补充R Sahu在第一部分的答案时,你写的比years
多了一个项目,你在底部的循环索引是不正确的。你试图访问一个超过分配的向量
数组末尾的项目,这就是为什么你会得到一个随机数和一个随机数输出。(更严格地说,它会导致未定义的行为。)
这是您之前的代码:
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处停止。谢谢,代码现在运行。但是它给出了一些有趣的结果。结果如下:输入一个以空格分隔的年份列表(输入负数停止)1812 1816 2005-1812是闰年1816是闰年2005不是闰年-1不是闰年1165250592是闰年我不确定结尾的随机数来自何处真棒谢谢你更新了答案,解决了我的问题,将-1作为输入并说它不是闰年。(i=0;我也一样,与其说是years[c]
,不如说是years.at(c)
。与其说是if(years[i]
tryif(years.at(i)
),不如说是超出了的范围,而不仅仅是一次崩溃。那么,这个问题会以超出范围的形式向你大胆地展示出来,而不是吗
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;
}
}
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;
}
}
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;
}
}