我似乎在将一个char数组从struct复制到另一个struct中的另一个char数组时遇到了问题。我得到一个分段错误,我认为它与在struct中为我的char数组分配内存有关。但有人可以确定导致核心倾销的确切点。
struct match
{
char *day;
char *date;
char *hour;
char *home_side;
char *visitors;
int home_result;
int visit_result;
int spectators;
int rounds;
int result;
};
struct team
{
char *name;
int victory_visit;
int victory_home;
int home_visitors;
};
typedef struct match match;
typedef struct team team;
然后我有一个填充结构名为match
的函数 void scan_matches(match *all_matches)
{
int i = 0, counter = 1, round_number = 1;;
FILE *ifp = fopen("kampe.txt","r");
char line[LINE_MAX];
while(fscanf(ifp," %[^\n]", line) == 1)
{
int thousand, hundreds;
sscanf(line,"%s %s %s %s - %s %d - %d %d.%d", &all_matches[i].day, &all_matches[i].date, &all_matches[i].hour, &all_matches[i].home_side, &all_matches[i].visitors,
&all_matches[i].home_result, &all_matches[i].visit_result, &thousand, &hundreds);
all_matches[i].spectators = ((thousand * 1000) + hundreds);
round_number = create_rounds(all_matches, counter, i, round_number);
counter++;
i++;
}
fclose(ifp);
}
之后是导致我麻烦的功能。我希望将匹配结构的char * homeside复制到team struct中的char *名称的函数。
void load_teams(match *all_matches, team *all_teams)
{
int i, j = 0;
for(i = 0; i < 6; i++)
{
strcpy(all_teams[j],all_matches[i].home_side);
j++;
strcpy(all_teams[j],all_matches[i].home_side);
j++;
}
for(i = 0; i < 12; i++)
{
printf("%s\n",all_teams[j].name);
}
}
答案 0 :(得分:1)
scanf
将不会分配内存,它会尝试写入已分配的缓冲区(对于您使用的所有%s参数)。
由于这些指针是垃圾(从未分配),memcpy
或strcpy
将因seg错误而失败。
答案 1 :(得分:0)
您:
struct match
{
char *day;
//...
指针指向字符,但没有存储来存储这些字符。因此,当你阅读它们时,它们就会被存储起来&#34;由sscanf在某个未确定的地方,这可能不是你的,所以操作系统会中止你的程序。
将它们声明为字符数组,或让sscanf将它们读入足够大小的缓冲区,然后确定其长度,然后使用malloc
分配存储并将缓冲区复制到该存储区。
答案 2 :(得分:0)
all_matches和all_teams未声明为数组
void load_teams(匹配* all_matches,team * all_teams)
所以你不能用这个:
的strcpy(all_teams [j]时,all_matches [I] .home_side); J ++; 的strcpy(all_teams [j]时,all_matches [I] .home_side); J ++;
你的功能应该像这样声明:
void load_teams(match **all_matches, team **all_teams)
同样的评论:
void scan_matches(match **all_matches)