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;
有两个问题。
- 在添加到
years
之前不检查x
的值是否大于0。
- 它不检查读取数据到
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。
我正在为程序编写代码 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;
有两个问题。
- 在添加到
years
之前不检查x
的值是否大于0。 - 它不检查读取数据到
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。