C++ While循环导致文件崩溃

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

我正在为一个编程类编写一个代码,该类将获取一个年份列表,然后显示它们是否为闰年。当我运行代码时,在输入年份列表并点击return后,文件崩溃

    #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]
    try
    if(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;
        }
    }