【发布时间】:2021-07-06 10:25:53
【问题描述】:
我有一个名为 TEAM 的结构,其中包含有关足球队的多个信息。
typedef struct team{
int ID; //1
char Team_name[MAX_LEN]; //2
int Status; //3
int Points; //4
int Score; //5
int Goals; //6
struct tm Date; //7
struct team *next;
}TEAM;
我正在创建一个团队的链接列表,团队信息是从一个文件中读取的,格式如下:
ID;teamname;status;points;score;goals;day/month/year hour:minute
我从文件中获取数据并完成所需的任务没有问题。但是我遇到了日期部分的问题。
我使用 strtok() 将一行拆分为标记,并尝试使用以下代码将标记的各个部分分配给它们各自的变量。
fscanf(token, "%d/%d/%d %d:%d", &tmp->Date.tm_mday, &tmp->Date.tm_mon, &tmp->Date.tm_year, &tmp->Date.tm_hour, &tmp->Date.tm_min);
但这给出了这个返回值 -1073741819 (0xC0000005) 据我所知,这被称为非法内存访问,我用 '&' 符号或 fscanf() 做的事情是错误的。
我的代码在没有 fscanf() 的情况下可以正常工作,那我做错了什么?
编辑:整个代码:
typedef struct team{
int ID; //1
char Team_name[MAX_LEN]; //2
int Status; //3
int Points; //4
int Score; //5
int Goals; //6
struct tm Date; //7
struct team *next;
}TEAM;
TEAM *createNode(void){
TEAM *node;
node = (TEAM *)malloc(sizeof(TEAM));
node->next = NULL;
return node;
}
TEAM *initialiseTeams(void){
FILE *fp;
TEAM *head;
TEAM *tmp;
char line[BUFFER];
char *token;
const char delim[2] = ";";
fp = fopen("Teams.txt","r");
if(fp == NULL){
printf("Failed to open Teams.txt\n");
exit(EXIT_FAILURE);
}
head = createNode();
tmp = head;
while(fgets(line, BUFFER, fp)){
int i;
for(i = 0, token = strtok(line, delim); token != NULL; i++, token = strtok(NULL, delim)){
printf("%s\n", token);
switch(i){
case 0: // ID
tmp->ID = atoi(token);
break;
case 1: // Team name
strcpy(tmp->Team_name, token);
break;
case 2: // Status
if(strcmp(token, "L") == 0){
tmp->Status = 0;
}
if(strcmp(token, "W") == 0){
tmp->Status = 1;
}
if(strcmp(token, "D") == 0){
tmp->Status = 2;
}
break;
case 3: // Points
tmp->Points = atoi(token);
break;
case 4: // Score
tmp->Score = atoi(token);
break;
case 5: // Goals
tmp->Goals = atoi(token);
break;
case 6: // Date
fscanf(token, "%d/%d/%d %d:%d", &tmp->Date.tm_mday, &tmp->Date.tm_mon, &tmp->Date.tm_year, &tmp->Date.tm_hour, &tmp->Date.tm_min);
break;
}
}
tmp->next = createNode();
tmp = tmp->next;
}
free(tmp);
return head;
}
int main(void){
TEAM *head;
head = initialiseTeams();
}
【问题讨论】:
-
我们无法调试不完整的代码片段。请提供complete minimal reproducible example。
-
编辑了问题
-
现在在调试器中运行您的程序并找出它崩溃的确切代码行。当你得到它然后转储变量以查看是否有任何指针值无效。 How to debug small programs.
-
您显示的代码没有您描述的代码行:
//fscanf(token, "%d/%d/%d %d:%d", tmp->Date.tm_mday, tmp->Date.tm_mon, tmp->Date.tm_year, tmp->Date.tm_hour, tmp->Date.tm_min);。这既被注释掉了,也没有所需的&。请给出实际的非工作代码。目前尚不清楚您的真实代码是否缺少&。 -
感谢您的链接!我确实启用了所有警告说“|警告:从不兼容的指针类型[-Wincompatible-pointer-types]|传递'fscanf'的参数1”所以将 fscanf 更改为 sscanf 就可以了。
标签: c pointers scanf singly-linked-list