为什么fscanf()不将此字符串存储在此指针中?

时间:2014-02-04 15:10:30

标签: c string scanf

好的,所以我无法读取字符串名称并将其存储在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); 
}

3 个答案:

答案 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文件。