簡體   English   中英

While循環導致文件崩潰

[英]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;
    }

問題1

years的聲明會創建一個空向量。 因此,生產線

years[c] = x;

是不正確的。 它使用邊界索引訪問years 采用

years.push_back(x);

問題2

讀取數據並檢測到該停止的邏輯是錯誤的。

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

有兩個問題。

  1. 在將x加到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

你正在寫一個超過哪個產品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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM