[英]While Loop causes file to crash
我正在為一個編程類編寫一個代碼,該代碼需要一個年份列表,然后顯示它們是否為leap年。 當我運行代碼時,輸入年份列表並按回車鍵后,文件崩潰。
#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;
}
years
的聲明會創建一個空向量。 因此,生產線
years[c] = x;
是不正確的。 它使用邊界索引訪問years
。 采用
years.push_back(x);
讀取數據並檢測到該停止的邏輯是錯誤的。
std::cin>> x;
years[c] = x;
有兩個問題。
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);
}
你正在寫一個超過哪個產品years
當您使用持有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;
}
}
為了補充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()
的循環迭代,但是您可以訪問的索引是直到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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.