我正在尝试读取文件,将值分配给结构成员,然后将值添加到动态内存分配中。我使用for循环读取所有值,然后将它们添加到动态数组中。它在我编译时给了我错误。
如何将值分配给Structure成员,同时将它们添加到动态数组中?
我真的很感谢你的帮助!!谢谢。
这是我的代码
struct Student
{
char *name[20];
char *gender[10];
int age;
char *course[20];
};
struct elements
{
struct Student *s;
struct elements *next;
};
FILE *file;
char c;
char type[30];
int main(int args, char *arg[])
{
struct Student *school = (struct Student *)malloc(sizeof(struct Student)); // Dynamic array
file = fopen(arg[1], "r"); // reading file
if(file != NULL)
{
while((c = fgetc(file)) != EOF) putchar(c);
{
int size;
int r;
for (r=0; r<size;r++)
{
fscanf("Name: %s", school->name);
//school->name = Addstudent(); // didn't work
//printf("names are: %s\n",school->name); // here I want to make sure the value name is in the array
}
}
}
else
{
printf("Unable to open file \n");
}
free(file);
return 0;
}
char* Addstudent()
{
char* name;
fscanf(file, "Name: %s",type ,name);
return name;
}
以下是错误
在函数'main'中:Latest1.c:59:4:警告:传递参数1 来自不兼容指针类型的'fscanf'[默认启用] /usr/include/stdio.h:449:12:注意:预期'struct FILE * 限制'但参数的类型为'char *'
Latest1.c:59:4:警告:传递'fscanf'的参数2 不兼容的指针类型[默认启用] /usr/include/stdio.h:449:12:注意:预期'const char * 限制'但参数的类型为'char **'
Latest1.c:59:4:警告:格式不是字符串文字而是格式 参数[-Wformat-security]
答案 0 :(得分:1)
对于初学者来说,这段代码可能没有做你想做的事情:
while((c = fgetc(file)) != EOF) putchar(c);
{
...
}
通过修复格式,您可以看到它被评估为
while((c = fgetc(file)) != EOF)
putchar(c);
{
...
}
while
循环仅包含putchar(c)
,并且在达到EOF后,大括号内的代码只会执行一次。
将调用混合到fgetc()
和fscanf()
通常也是一个坏主意。将一行一行读入变量,然后解析变量中的数据会更安全:
char buf[MAX_LEN];
while (fgets(buf, MAX_LEN, file) != NULL) {
sscanf(buf, "%s", school->name);
}
阅读完文件后,您需要fclose
,而不是free
。
最后,虽然您已为Student
结构中的元素分配了内存,但没有为name
,{{1}的数据分配空间}和gender
指针将指向。
答案 1 :(得分:0)
你的代码有很多错误;
你真的明白这是什么声明吗? char * name [20]
真的仔细看看这一行,这既不是数组,也不是你想要做的事情: struct Student * school =(struct Student *)malloc(sizeof(struct Student)); //动态数组
阅读fscanf
(ps抱歉,如果格式化已关闭,仍然可以掌握新手机)