使用for循环创建结构名称

Creating structure names using a for loop?

本文关键字:结构 创建 for 循环 使用      更新时间:2023-10-16

我如何使用这个结构并为它创建32个不同的团队名称?

要填充的结构:

typedef struct team{
    int stats[4];
}Team;

这是文本文件:

patriots 300 200 500 200
rams 200 340 230 300
cardinals 300 200 450 150
...

实例化32个Team实例似乎是多余的,例如:

Team patriots;
Team rams;
Team cardinals;
...

如何创建这些实例,以便我可以通过它们的名称来识别它们?

(请参阅代码段中的最后一条注释,查看我哪里出了问题)

int main(int argc, char* argv[]){
    int i = 0;
    int j = 0;
    FILE* file = fopen(argv[1], "r");
    for(i = 0 ; i < 32 ; i++){
        // Read the name
        string name;
        fscanf(file, "%s", name)
        // Create an instance of Team by its name
        /* PROBLEM : Obviously this does not work, 
                     how to name a variable as this? */
        Team name;
        for(j = 0 ; j < 4 ; j++){
            fscanf(file, "r", &name.stats[j]);
        }
    }
}

您可能还需要考虑使用std::mapstd::unordered_map来保存数据。

这些允许您从名称(例如Rams)映射到一些相关数据(在您的情况下是统计数据)。

std::map<std::string, team> data;

这允许您(例如)将data视为一个由字符串索引的数组,因此您可以执行以下操作:

std::string team_name;
team temp_team;
std::cin >> team_name >> temp_team;
data[team_name] = temp_team;

这通常不是最有效的方法(它可能有点慢,而且比其他方法使用更多的内存),但它很方便,性能通常绰绰有余。

您正处于人们需要Array的阶段。

创建一个长度为32的数组。

Team teams[32];

然后:

for(i = 0 ; i < 32 ; i++){
    string name;
    fscanf(file, "%s", name);
    for(j = 0 ; j < 4 ; j++){
        fscanf(file, "%d", &teams[i].stats[j]);
    }
}

注意:若要使用团队名称,则可以向结构中添加一个新的字符串字段,然后在从文件中读取后进行赋值。

您不能这样做,因为您正在声明一个名为name的字符串。因此,当您试图声明团队时,该变量名称已经存在。

将字符串添加到对象Team中,然后将文件中的名称写入Team的实例中。

既然您有三十二个团队,那么创建一个向量来容纳所有团队。

你也可以创建Team::stats作为一个向量,这样你就可以获得每支球队不同数量的分数(稍后可能会延长分数日期和他们对阵的球队)。

typedef struct team
{
    std::string name;
    int stats[4];
} Team;
int main(int argc, char* argv[])
{
    std::vector<Team> teams;
    int i = 0;
    int j = 0;
    FILE* file = fopen(argv[1], "r");
    for(i = 0 ; i < 32 ; i++)
    {
        Team team;
        fscanf(file, "%s", team.name)
        for(j = 0 ; j < 4 ; j++)
            fscanf(file, "r", team.stats[j]);
        teams.push_back( team );
    }
}