我的矢量元素在每次输入后都会不断地改变自己

My vector elements keep changing themselves after each input

本文关键字:改变自己 输入 元素 我的      更新时间:2024-05-20
char* name = (char*)malloc(sizeof(char));
char* highscore = (char*)malloc(sizeof(char));
char* password = (char*)malloc(sizeof(char));
player* c = new player(name, highscore, password);
int i;
int j = 0;
int score = 0;
vector <player*> players;
vector <char*>* names = new vector <char*>;
vector <char*>* passwords = new vector <char*>;
vector <int> scores;
ifstream input;
input.open("user.csv");        
do {
cout << "Welcome to Champion Yahtzeen";
cout << "Player Name            Highest Scoren";
cout << "-----------            -------------n";
while (input.good())
{
input >> *c;
players.emplace_back(c);
names->push_back(name);
score = atoi(highscore);
scores.push_back(score);
passwords->push_back(password);
j++;
}

这是我的代码,我知道为了输入到它中,我们必须扩展向量?至少从我读到的适合新字符的内容来看,我真的不知道如何修复它。我曾尝试将向量初始化为vector <player*> players;,但这没有用,因为在每次输入后,它都会覆盖以前的指针,并将所有元素设置为输入。我该怎么解决这个问题?

您在任何地方都获得相同值的原因是,您只分配了一次存储内存,然后将相同的内存地址一次又一次地推送到向量中。

基本上,你总是只有一个对象。

要解决这个问题,您必须在循环中分配新对象,如下所示:

vector <player*> players;
vector <char*> names;
vector <char*> passwords;
vector <int> scores;
ifstream input;
input.open("user.csv");        
cout << "Welcome to Champion Yahtzeen";
cout << "Player Name            Highest Scoren";
cout << "-----------            -------------n";
while (input) { //this is the proper way in c++ 11 and up
char* name = new char[MAX_NAME_LEN];
char* highscore = new char[MAX_SCORE_LEN];
char* password = new char[MAX_PASSWORD_LEN];
player* c = new player(name, highscore, password);

input >> *c;
players.emplace_back(c);
names.push_back(name);
int score = atoi(highscore);
scores.push_back(score);
passwords.push_back(password);
}

以下是对代码更改的解释:

  1. 除非你的作业中有一些奇怪的要求,否则向量不需要是指针,它们只需要包含指针。

  2. 我们在每个循环的开头分配新的对象,所以每次读取数据时,它都会进入内存中的一个新位置。

  3. 若必须使用char *,则应该定义常量(或宏(,如MAX_NAME_LEN,以获得name字段的最大长度
    您的作业可能会为所有字段指定最大输入长度,以简化操作。

  4. while循环中的条件只是流对象
    从C++11开始,它覆盖到bool的强制转换以返回true,同时可以读取更多数据
    如果您使用的是较旧的C++标准,请使用while (!input.eof()),或者检查input >> *cbreak的返回值(如果是false(。

  5. 如果您正在编写C++,则应该使用new来分配内存
    尽管malloc将正确工作,但它被认为是";C路";并且不鼓励在C++中使用它。