2016-07-30 214 views
-2
#include <iostream> 
#include <string> 

using namespace std; 

struct person 
{ 
    string name; 
    int numberofpies; 
    string flavour; 
}; 

int main() 
{ 
    for (int i=1; i<10; i++) 
    { 
    cout << "press <1> to add a person or press <2> to get results" << endl; 
    int input; 
    cin >> input; 
    person newperson[i]; 
    string names, flavours; 
    int numbersofpies; 
    if (input==1) 
     { 
     cout << "please enter your name " << endl; 
     cin >> names; 
     cout << "enter the number of pies you ate" << endl; 
     cin >> numbersofpies; 
     cout << "enter the flavour" << endl; 
     cin >> flavours; 
     newperson[i].numberofpies=numbersofpies; 
     newperson[i].flavour=flavours; 
     newperson[i].name=names; 
     } 
     else if(input == 2) 
     { 
      int x=1; 
      while (x>i) 
      { 
       cout << "name : " << newperson[x].name << endl; 
       cout << "number of pies : " << newperson[x].numberofpies<< endl; 
       cout << "flavour: " << newperson[x].flavour << endl; 

      }goto point; 
     } 


    }point: 
     return 0;  
} 

我的問題是,該代碼正常編譯和運行完全,直到第一循環結束,然後將其實驗和嘗試不同的解決方案,我意識到這個問題是在過去的三年線後死機等等'if語句'for循環一次迭代後墜毀

newperson[i].numberofpies=numbersofpies; 
newperson[i].flavour=flavours; 
newperson[i].name=names; 

因爲刪除它們後問題就消失了。然而,這個程序顯然不會做它應該做的事情,所以我想我的問題在這些方面有什麼問題,如果他們不是問題是什麼?我該如何解決它? 另外,我不介意其他方法,如果它有我可以學習的想法,但我最重要的是瞭解問題,以瞭解沒有得到程序運行的興趣。

+3

評論你對數組的書再次章節。 – LogicStuff

+1

認真這就是所有你不得不說的你不能告訴我我的錯誤? – fahad97azawi

+1

檢查數組索引邊界限制。另外,可變長度數組不是標準的C++,而是一些編譯器提供的擴展,它最好避免。 – doug

回答

2

person newperson[i];正在聲明可變長度數組,而且VLA是非標準供應商特定的編譯器擴展。不要使用它們。如果您需要可變長度陣列,請改爲使用std::vector

在這種情況下,您的代碼未定義行爲,因爲你的循環變量i總是出你分配VLA的界限的,所以當你嘗試設置陣列的成員,newperson[i]正觸及到周圍的記憶在陣列之外。這就是爲什麼你的代碼崩潰。

數組索引是基於0的,但是您的循環變量是基於1的。因此,在第一次迭代中,您將分配一個包含1個元素的數組,然後訪問第二個元素。在第二次迭代中,您將分配一個包含2個元素的數組,然後訪問第三個元素。等等

2

當你宣佈你的陣列這樣

person newperson[i]; 

它使大小i的新數組,這意味着指數從0(包括)到i-1,包容,允許在newperson陣列。這是一個問題,因爲索引newperson[i]是非法的。

此外,newperson的大小直到運行時才知道,這意味着它是一個可變長度數組; C++標準不允許這樣做,所以你正在使用一個流行的擴展。

修復這個問題很簡單 - 移動申報外循環,並使其

person newperson[10]; 

您需要修改這個代碼的一些其他問題:

  • ifor循環和xwhile循環需要從零開始,而不是一個。
  • goto應該避免;在這種情況下,break就足夠了。
  • i達到10時,無法輸出。這可能沒有問題,但您可能需要強制的某些輸出以提醒最終用戶這種情況。例如,輸入2可能會退出循環,並且while循環可能正好在for循環之後。這將優雅地處理goto/break問題,並且不會有重複的代碼。
+0

讓你的循環從0開始,而不是從1開始。 – pie3636

+0

@ pie3636是的,OP似乎在兩個地方('i'和'x')錯過了這個部分。 – dasblinkenlight

1

讓我們看一下第一次迭代:

i=1,所以definion:

person newperson[i]; 

定義長度的數組1.

現在,當你分配:

  newperson[i].numberofpies=numbersofpies; 

您訪問數組的第二項(因爲newperson[0]是第一項,而newperson[1]是被調用的),這並不存在。

什麼你真的想要做的就是定義:

person newperson[10]; 

循環,並從i=0迭代。

0
#include <iostream> 
#include <string> 

using namespace std; 

struct person 
{ 
    string name; 
    int numberofpies; 
    string flavour; 
}; 

int main() 
{ 
const int Pcount = 10; 
int input; 
cin >> input; 
person newperson[Pcount]; 
string names, flavours; 
int numbersofpies; 

for (int i=1; i<Pcount; i++) 
    { 
    cout << "press <1> to add a person or press <2> to get results" << endl; 
     if (input==1) 
     { 
     cout << "please enter your name " << endl; 
     cin >> names; 
     cout << "enter the number of pies you ate" << endl; 
     cin >> numbersofpies; 
     cout << "enter the flavour" << endl; 
     cin >> flavours; 
     newperson[i].numberofpies=numbersofpies; 
     newperson[i].flavour=flavours; 
     newperson[i].name=names; 
     } 
     else if(input == 2) 
     { 
      int x=1; 
      while (x>i) 
      { 
       cout << "name : " << newperson[x].name << endl; 
       cout << "number of pies : " << newperson[x].numberofpies<< endl; 
       cout << "flavour: " << newperson[x].flavour << endl; 

      } 
      break; 
     } 


    } 
     return 0;  
} 

試着像這樣至少做到這一點。

-1

你被錯誤地分配內存對於一個人陣 讓我們來聲明一個常量保持元件的數量要存儲在陣列中

const int NUM_PERSON =10; 

#define NUM_PERSON 10; 

進入循環前添加此 這是爲10個人類型的對象分配足夠的內存

person newperson[NUM_PERSON] 

現在你可以訪問它的元素通過使用語法

newperson[i].numberofpies 
newperson[i].flavour 
newperson[i].name 
+0

對一個bug_的_off沒有幫助。 –

0
  1. 採取person newperson[i];外面的for循環並將其更改爲person newperson[10];
  2. 變化while (x>i)while (x<=i)
  3. 的結束前添加x++; while循環。

下面是編輯的代碼:

#include <iostream> 
#include <string> 

using namespace std; 

struct person 
{ 
    string name; 
    int numberofpies; 
    string flavour; 
}; 

int main() 
{ 
    person newperson[10]; 
    for (int i=1; i<10; i++) 
    { 
    cout << "press <1> to add a person or press <2> to get results" << endl; 
    int input; 
    cin >> input; 
    string names, flavours; 
    int numbersofpies; 
    if (input==1) 
     { 
     cout << "please enter your name " << endl; 
     cin >> names; 
     cout << "enter the number of pies you ate" << endl; 
     cin >> numbersofpies; 
     cout << "enter the flavour" << endl; 
     cin >> flavours; 
     newperson[i].numberofpies=numbersofpies; 
     newperson[i].flavour=flavours; 
     newperson[i].name=names; 
     } 
     else if(input == 2) 
     { 
      int x=1; 
      while (x<=i) 
      { 
       cout << "name : " << newperson[x].name << endl; 
       cout << "number of pies : " << newperson[x].numberofpies<< endl; 
       cout << "flavour: " << newperson[x].flavour << endl; 
       x++; 
      }goto point; 
     } 


    }point: 
     return 0;  
}