动态阵列输出问题

时间:2011-09-21 00:53:36

标签: c++ pointers dynamic-arrays

我正在完成一项家庭作业,我必须使用指针将程序中的所有静态数组转换为动态数组。我很确定我理解这个概念,我做了更改,程序也运行了。问题出在我的输出结果上。我怀疑我从我正在使用的文件输入错误的数据。这是我的问题以及相关代码的图片:

此点之后的9/21编辑:

输出&数据文件: enter image description here

主要

#include "Ch9_Ex7.h"

int main()
{
    int numCandidates;
    string *allCandidates;
    int *votes;
    int index, totalVotes;
    ifstream infile;

    allCandidates = new string[1];
    votes = new int[1];


    infile.open("./Ch9_Ex7Data.txt");
    if (!infile)
    {
        cerr << "Cannot open input file. Program terminates!" << endl;
        return 1;
    }

// read number of candidates

    readVotes (infile, votes, allCandidates, numCandidates);

    //delete [] votes;
    //delete [] allCandidates;

输入功能:

#include "Ch9_Ex7.h"

void readVotes (ifstream & infile, int *&votes,
                string *&allCandidates, int & numCandidates)
{

//    read number of candidates
    infile >> numCandidates;
    infile.ignore();  // carriage return

    //delete [] votes;
    //delete [] allCandidates;

    allCandidates = new string[numCandidates];
    votes = new int[numCandidates];

    for (int index = 0; index < numCandidates; index++)
    {
        infile >> votes[index];
        infile.ignore();  // space
        getline(infile, allCandidates[index]);
    }

}

2 个答案:

答案 0 :(得分:3)

您正在使用以下代码创建一个char和一个int的数组:

allCandidates = new char[1];
votes = new int[1];

我相信你的意思是:

allCandidates = new char[numCandidates];
votes = new int[numCandidates];

创建大小为numCandidates的动态数组。

此外,当您输入候选人姓名时,您可能希望使用std::string,如下所示:

string *allCandidates;
allCandidates = new string[numCandidates];

(感谢Ben Voigt指出这一点)而且由于你输入了他们的全名,你需要以不同的方式输入它。也许使用getline()

getline(cin, allCandidates[i]);

回复您的修改:

您必须将指针作为参考传递,如下所示:

void readVotes (ifstream & infile, int *&votes, string *&allCandidates, int & numCandidates)

并在main()

中释放它们
delete[] votes;
delete[] allCandidates;

答案 1 :(得分:1)

首先,这是绝对糟糕的设计,所以请不要在本练习的范围之外这样做。

现在,关于这个问题。如果要在某处创建动态对象(或数组)并将指针传递给它,则应该通过引用获取指针。您还必须将名称读入字符串,而不是单个字符。

void readVotes (std::ifstream & infile, int * & votes, std::string * & allCandidates, int & numCandidates)
{
  // read numCandidates

  votes = new int[numCandidates];
  allCandidates = new std::string[numCandidates];

  // populate
}

来电者必须记得清理:

int main()
{
  int n;
  int * votes;
  std::string * names;

  readVotes(std::cin, votes, names, n);

  // ...

  delete[] votes;
  delete[] names;
}

(在实际情况中,我会让函数返回std::vector<std::pair<int, std::string>>。)