我目前正在为学校写一个小程序,我们必须使用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);
}
所以我是segfaulting,它告诉我它发生在readLines函数中,并且不知道如何解决这个问题。任何帮助表示赞赏。谢谢!
答案 0 :(得分:2)
一个问题是对undefined
的调用。您的文件使用空格作为分隔符,因此您应该这样做:
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
会忽略\n
。如果您希望从返回的令牌中删除它,请将atoi
替换为" \n"
的最后一个参数。