循环导致文件崩溃

时间:2018-02-27 05:04:21

标签: c++ while-loop crash

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

    #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;
    }

2 个答案:

答案 0 :(得分:3)

问题1

years的声明会创建一个空矢量。因此,行

years[c] = x;

不对。它使用越界索引访问years。使用

years.push_back(x);

问题2

读取数据并检测到其停止时间的逻辑是错误的。

std::cin>> x;
years[c] = x;

有两个问题。

  1. 在将x添加到years之前,它不会检查x的值是否大于0。
  2. 它不会检查对while(std::cin >> x) { if(x<=0) { break; } years.push_back(x); } 的数据读取是否成功。它假定它是成功的。
  3. 将阅读代码更改为:

    while

    您可以将检查结合到while ( (std::cin >> x) && ( x > 0 ) ) { years.push_back(x); } 语句的条件中。

    years

    问题3

    当您在循环中使用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。