我正在完成一项家庭作业,我必须使用指针将程序中的所有静态数组转换为动态数组。我很确定我理解这个概念,我做了更改,程序也运行了。问题出在我的输出结果上。我怀疑我从我正在使用的文件输入错误的数据。这是我的问题以及相关代码的图片:
此点之后的9/21编辑:
输出&数据文件:
主要
#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]);
}
}
答案 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>>
。)