第一次迭代后循环崩溃

时间:2016-07-30 22:39:41

标签: c++ for-loop crash structure

#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;    
}

我的问题是这段代码正常编译并运行完美,直到第一个循环结束然后它崩溃所以在试验和尝试不同的解决方案之后我意识到问题出现在&#39; if语句的最后三行&# 39;

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

因为删除它们之后问题就消失了。然而,该程序显然不会做它应该做的事情,所以我想我的问题在这些方面是错误的,如果它们不是问题是什么?以及如何解决? 另外,如果我有可以学习的想法,我根本不介意其他方法,但我最重要的是要了解问题而学习不让程序运行?

6 个答案:

答案 0 :(得分:2)

当你声明你的数组时

person newperson[i];

它创建了一个大小为i的新数组,这意味着i-1数组允许从0(包括0和包含)到newperson的索引。这是一个问题,因为索引newperson[i]是非法的。

此外,newperson的大小直到运行时才知道,这意味着它是一个可变长度的数组; C ++标准不允许这样做,所以你使用了一个流行的扩展。

解决问题很简单 - 将声明移到循环之外,并使其成为

person newperson[10];

您需要使用此代码修复其他一些问题:

  • i循环中的forx循环中的while都需要从零开始,而不是一个。
  • 应该避免
  • goto;在这种情况下,break就足够了。
  • i达到10时,无法输出。这可能没问题,但您可能需要强制某些输出来警告最终用户这种情况。例如,输入2可以退出循环,while循环可能在for循环之后。这样可以优雅地处理goto / break问题,并且不存在重复的代码。

答案 1 :(得分:2)

person newperson[i];声明可变长度数组,而VLA是非标准供应商特定的编译器扩展。不要使用它们。如果您需要可变长度数组,请改用std::vector

在这种情况下,您的代码具有未定义的行为,因为您的循环变量i总是超出您正在分配的VLA的范围,所以当您尝试设置成员时数组,newperson[i]到达数组外的周围内存。这就是你的代码崩溃的原因。

数组索引从0开始,但您的循环变量是从1开始的。因此,在第一次迭代中,您将分配一个包含1个元素的数组,但随后访问第二个元素。在第二次迭代中,您将分配一个包含2个元素的数组,但随后访问第三个元素。等等

答案 2 :(得分:1)

让我们看看第一次迭代:

i=1,所以定义:

    person newperson[i];

定义一个长度为1的数组。

现在,当你指定:

            newperson[i].numberofpies=numbersofpies;

您可以访问数组的第二项(因为newperson[0]是第一项,而newperson[1]是附加的),但它并不存在。

您真正想要做的是定义:

person newperson[10];

外部循环,并从i=0迭代。

答案 3 :(得分: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;    
}

至少尝试这样做。

答案 4 :(得分:0)

  1. 在for循环之外取person newperson[i];并将其更改为person newperson[10];
  2. while (x>i)更改为while (x<=i)
  3. 在while循环结束前添加x++;
  4. 以下是编辑过的代码:

    #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;    
    }
    

答案 5 :(得分:-1)

您错误地为人员阵列分配内存 让我们声明一个常量,保存要存储在数组中的元素数量

const int NUM_PERSON =10;

#define NUM_PERSON 10;

在进入循环之前添加此项 这样做是为10个人类对象分配足够的内存

person newperson[NUM_PERSON]

现在您可以使用语法

访问它的元素
newperson[i].numberofpies
newperson[i].flavour
newperson[i].name