While 循环导致文件崩溃

While Loop causes file to crash

我正在为程序编写代码 class,它接受年份列表,然后显示它们是否是闰年。当我 运行 代码时,在输入年份列表并点击 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;
    }

问题 1

years 的声明创建了一个空向量。因此,行

years[c] = x;

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

years.push_back(x);

问题 2

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

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

有两个问题。

  1. 在添加到years之前不检查x的值是否大于0。
  2. 它不检查读取数据到x是否成功。它假定它是成功的。

修改阅读码为:

while(std::cin >> x)
{
   if(x<=0)
   {
      break;
   }

   years.push_back(x);
}

您可以将检查合并到 while 语句的条件中。

while ( (std::cin >> x) && ( x > 0 ) )
{
   years.push_back(x);
}

问题 3

当您在循环中使用 i <= years.size() 时,您写的内容比 years 多写了一项。必须是 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;
   }
}

为了补充 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。