我目前正在为学校编写一个小程序,我们必须使用 fgets 和 strtok 来读取文件。
input.txt is:
Redden 2 0
Berglund 5 2
Jackman 2 0
Stewart 4 0
Oshie 3 5
McDonald 2 4
这是相关代码
int main(int arg, char *argv[]) {
FILE *fp=fopen(argv[1]);
char **names=NULL;
int *goals=NULL;
int *assists=NULL;
int size = countLinesInFile(fp);
allocateMemory(&goals, &assists, &names, size);
readLines(fp, goals, assists, names, size);
}
void allocateMemory(int** goals, int** assists, char*** names, int size) {
*goals = malloc(size*sizeof(int));
*assists = malloc(size*sizeof(int));
*names = malloc(size*sizeof(char *));
int i;
for(i=0; i<size; i++)
{
*(*names + i) = malloc(MAX_NAME*sizeof(char));
}
}
void readLines(FILE *ptr, int *goals, int *assists, char **names, int size) {
char *line=malloc(MAX_LINE*sizeof(char));
int i;
char *token=NULL;
for(i=0;i<size;i++) {
if(fgets(line,MAX_LINE, ptr)!=NULL); {
token=strtok(line,"");//segfaulting somewhere around these lines
strcpy(names[i],token);
token=strtok(NULL,"n");
goals[i]=atoi(token);
token=strtok(NULL,"n");
assists[i]=atoi(token);
}
}
free(line);
}
所以我正在分段错误,它告诉我它发生在 readLines 函数中,不知道如何解决这个问题。任何帮助,不胜感激。谢谢!
一个问题是对strtok
的调用。您的文件使用空格作为分隔符,因此您应该执行相同的操作:
if(fgets(line,MAX_LINE, ptr)!=NULL); {
token=strtok(line," ");
strcpy(names[i],token);
token=strtok(NULL," ");
goals[i]=atoi(token);
token=strtok(NULL," ");
assists[i]=atoi(token);
}
请注意,第三个标记将包含n
字符。atoi
忽略n
。如果要将其从返回的令牌中删除,请将最后一个参数替换为" n"
以strtok
。