fscanf()读取错误
我有一个文本文件,我正在把名字和姓氏读入一个大小为20的字符数组。我正在创建一个结构数组,它保存“人的”信息。 文本文件如下所示:fscanf()读取错误,c,file-io,scanf,C,File Io,Scanf,我有一个文本文件,我正在把名字和姓氏读入一个大小为20的字符数组。我正在创建一个结构数组,它保存“人的”信息。 文本文件如下所示: John Robbins Teresa Jones 我的结构定义如下: struct people { char name[20]; }; 人事声明结构: struct people *persons[2]; 在声明了一个新结构后,我读入了带有以下代码的名称: for(i=0; i<2; i++) { fscanf(dp, "%[^\n]s
John Robbins
Teresa Jones
我的结构定义如下:
struct people {
char name[20];
};
人事声明结构:
struct people *persons[2];
在声明了一个新结构后,我读入了带有以下代码的名称:
for(i=0; i<2; i++)
{
fscanf(dp, "%[^\n]s", &persons[i].name[20]);
}
我做了大量的研究,找不到解决这个问题的办法。有没有人遇到过这个问题
fscanf(dp, "%[^\n]s", &persons[i].name[20]);
这会将该行读到一个换行符,然后尝试读取一个将失败的s
。换行前的行将存储在人员结构中名称
数组的末尾(这意味着它将覆盖到人员
数组的下一个元素中)
你想要的是:
fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name);
相反--初始空格跳过前导空格(包括前一行中的任何换行符)。%19[^\n]
最多读取19个字符或一个换行符并存储它,后跟一个终止NULL(因此将使用整个20字节名称数组,但不会更多)。%*[^\n]
将读取换行符之前(不包括换行符)行中的任何附加字符并将其丢弃
您还需要检查fscanf
调用的返回值,以确保不会出现错误或文件结尾:
#define MAX_PEOPLE 2
struct people persons[MAX_PEOPLE];
i = 0;
while (i < MAX_PEOPLE && fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name) > 0)
i++;
#定义最大人数2
结构人员[最大人员];
i=0;
而(i0)
i++;
这会将该行读取到一个换行符,然后尝试读取一个将失败的s
。换行符将存储在人员结构中name
数组的末尾(这意味着它将覆盖到persons
数组的下一个元素中)
你想要的是:
fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name);
相反--初始空格跳过前导空格(包括前一行中的任何换行符)。%19[^\n]
最多读取19个字符或一个换行符并存储它,后跟一个终止NULL(因此将使用整个20字节名称数组,但不会更多)。%*[^\n]
将读取换行符之前(不包括换行符)行中的任何附加字符并将其丢弃
您还需要检查fscanf
调用的返回值,以确保不会出现错误或文件结尾:
#define MAX_PEOPLE 2
struct people persons[MAX_PEOPLE];
i = 0;
while (i < MAX_PEOPLE && fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name) > 0)
i++;
#定义最大人数2
结构人员[最大人员];
i=0;
而(i0)
i++;
请显示person数组的声明。刚刚添加了“Persons”结构的声明是否只是一个拼写错误,您在声明中大写了Persons,但在使用它时却没有?是的,这只是一个拼写错误,您的代码甚至没有编译。Persons[i]不是结构而是指向结构的指针。请显示person数组的声明。只是添加了“Persons”结构的声明。这只是一个拼写错误,您在声明中大写了Persons,但在使用它时却没有。是的,这只是一个拼写错误,您的代码甚至没有编译。Persons[i]不是结构,而是指向结构的指针。根据发布的persons
声明,它应该是persons[i]->name
。是的,他需要将声明更改为struct people[2];
或者他拥有的代码甚至不会编译。将其作为一个指针数组也需要为其分配空间。根据发布的persons
声明,它应该是name
。是的,他需要将声明更改为struct people[2]
或者他拥有的代码甚至无法编译。将其作为指针数组也需要为其分配空间。