C 将所有列表值更改为最后一个值
我有一段代码有点混乱,所以我构建了一个结构:C 将所有列表值更改为最后一个值,c,C,我有一段代码有点混乱,所以我构建了一个结构: typedef struct{ char *team_name; }Team; 和其他结构: typedef struct{ Team** teams; int num_teams; }League; 以及创建结构团队的函数: Team* TeamCreate(char* team_n) { Team* t=(Team*)malloc(sizeof(Team)); t->team_name =team_n; return t; } 同样对
typedef struct{
char *team_name;
}Team;
和其他结构:
typedef struct{
Team** teams;
int num_teams;
}League;
以及创建结构团队的函数:
Team* TeamCreate(char* team_n)
{
Team* t=(Team*)malloc(sizeof(Team));
t->team_name =team_n;
return t;
}
同样对于联盟结构:
League* LeagueCreate()
{
League* l=(League*)malloc(sizeof(League));
return l;
}
最糟糕的部分是这个函数,它应该在“Team**teams”中插入一个文本文件的单词
因此,在teams
的每个值中,都有teams
值包含这个词char*teamu\u name
。
函数使所有团队列表值等于团队列表的最后一个值。
职能:
void read_teams(League* l,char* text)
{
FILE *fp=fopen(text,"r");
char* tname=NULL;
size_t tname_size=0;
l->num_teams=0;
l->teams=NULL;
while(getline(&tname,&tname_size,fp)!=EOF)
{
char *p= strchr(tname,'\n');
if (p)
tname[p-tname]='\0';
l->teams=(Team**)realloc(l->teams,sizeof(Team*)*(l->num_teams+1));
l->teams[l->num_teams]=TeamCreate(tname);
l->num_teams++;
}
fclose(fp);
}
例如,我的文本文件是:
Napoli
Salzburg
Liverpool
Genk
当我写作时:
printf("\n%s\n",l->teams[0]->team_name);
printf("\n%s\n",l->teams[1]->team_name);
printf("\n%s\n",l->teams[2]->team_name);
printf("\n%s\n",l->teams[3]->team_name);
它打印了以下内容:
Genk
Genk
Genk
Genk
谢谢您的时间:)。当您第一次呼叫
getline
时,将为您分配足够的空间容纳线路。除非后续调用realloc内存,否则每次传递的都是相同的指针TeamCreate
。因此,您的所有团队
都具有相同的char*
,因此具有相同的团队名称
。每次通过getline
更新字符串时,所有team\u name
s都将更改,因为它们引用相同的字符串
在TeamCreate
中需要做的是使用string.h
中的strdup
函数,以便每个Team
获得自己的字符串。即
t->team_name = strdup(team_n);
第一次调用
getline
,将为您分配足够的空间来容纳该行。除非后续调用realloc内存,否则每次传递的都是相同的指针TeamCreate
。因此,您的所有团队
都具有相同的char*
,因此具有相同的团队名称
。每次通过getline
更新字符串时,所有team\u name
s都将更改,因为它们引用相同的字符串
在TeamCreate
中需要做的是使用string.h
中的strdup
函数,以便每个Team
获得自己的字符串。即
t->team_name = strdup(team_n);
逐行读取.txt文件
#define MAXCHAR 1000
char* filename = "G:\\test.txt";
fp = fopen(filename, "r");
if (fp == NULL){
printf("Could not open file %s",filename);
return 1;
}
while (fgets(str, MAXCHAR, fp) != NULL)
printf("%s", str);
fclose(fp);
逐行读取.txt文件
#define MAXCHAR 1000
char* filename = "G:\\test.txt";
fp = fopen(filename, "r");
if (fp == NULL){
printf("Could not open file %s",filename);
return 1;
}
while (fgets(str, MAXCHAR, fp) != NULL)
printf("%s", str);
fclose(fp);
但我保留Team*t=(Team*)malloc(sizeof(Team));是吗?是的,虽然你不需要
(Team*)
演员阵容。是的,但这就是我要求的,谢谢你,你解决了我的问题。但我保留Team*t=(Team*)malloc(sizeof(Team));是吗?是的,虽然你不需要(团队*)
演员阵容。是的,但这就是我要求的,谢谢你,你解决了我的问题。