好的,所以我无法读取字符串名称并将其存储在student类型的struct数组中。 age字段是一个int,gpa字段是double,而且工作正常。然后,当我添加要读取的名称时,我开始遇到问题。如何成功读取名称并将其存储在student.name字段中?下面的代码崩溃,我不知道为什么。我是C新手所以请告诉我是否有更好的方法来做到这一点。先感谢您。哦,名字是连续的字母,字符之间没有空格。
typedef struct student{
char *name; int age; double gpa;
}student;
void read(char *filename) {
File *file = fopen(filename,"r");
if(!file) return;
student *students = malloc(sizeof(student)*100);
int num_students = 10; //for example
int i;
for (i=0;i<num_students;i++) {
char *n = malloc(MAXLENGTH);
fscanf(file,"%s %i %lf", n,&students[i].age,&students[i].gpa); //<---runtime error occurs here
strcpy(students[i].name,n);
free(n);
}
/*code here to do stuff with the array*/
free(students);
fclosef(file);
}
答案 0 :(得分:1)
尝试将此行strcpy(students[i].name,n);
替换为students[i].name = strdup(n);
我使用strdup
分配足够的内存来保存字符串,如果您尝试=
它会起作用,但会将name
设为只读! strcpy()
也会工作
在这里您可以参考strdup:strdup() - what does it do in C?
另外,我还没有看到你为students[i].name
答案 1 :(得分:1)
int n =0;
for (i=0;i<num_students;i++) {
char *n = malloc(MAXLENGTH);
n = fscanf(file,"%s %i %lf", n,&students[i].age,&students[i].gpa);
if(n!= 3 || n = EOF){
printf("invald input..");
}
students[i].name = malloc(strlen(n) +1);
if(student[i].name != NULL){
strcpy(students[i].name,n);
}
free(n);
}
man fscanf
成功完成后,这些函数将返回成功匹配的数量
和指定的输入项目;如果早期匹配,此数字可以为0
失败。如果输入在第一次匹配失败或转换之前结束,则EOF为
回。如果发生读取错误,则设置流的错误指示符,EOF为
返回,并设置errno以指示错误。
答案 2 :(得分:0)
您的问题是您要存储到n数组的文件中的“字符串”没有null终止符。所以%s对fscanf()不起作用。尝试其他选项,将其视为cvs文件。