好的,所以我在读取字符串名并将它们存储在类型类型的struct数组中时遇到了困难。年龄场是整数,gpa场是双倍的,而那些工作得很好。然后,当我添加要读取的名称时,我开始遇到问题。如何成功地读取名称并将其存储在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);
}
发布于 2014-02-04 07:23:25
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);
}
曼福斯
在成功完成之后,这些函数返回成功匹配和分配的输入项的数量;如果早期匹配失败,这个数字可以是0。如果输入在第一次匹配失败或转换之前结束,则返回EOF。如果发生读取错误,则设置流的错误指示符,EOF为
返回,并将errno设置为指示错误。
发布于 2014-02-04 07:13:46
尝试将这一行strcpy(students[i].name,n);
替换为students[i].name = strdup(n);
我使用strdup
来分配足够的内存来保存字符串,如果您尝试=
,它将工作,但是会使name
成为只读的!strcpy()
也会工作。
在这里,您可以参考使用strdup:strdup() - what does it do in C?
另外,我不认为您为students[i].name
分配内存
发布于 2014-02-04 07:26:53
您的问题是,要存储到n数组中的文件中的“字符串”没有空终止符。因此,%s不能很好地工作在fscanf()中。尝试另一个选项,将其视为cvs文件。
https://stackoverflow.com/questions/21556119
复制