Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将所有列表值更改为最后一个值_C - Fatal编程技术网

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));是吗?是的,虽然你不需要
(团队*)
演员阵容。是的,但这就是我要求的,谢谢你,你解决了我的问题。