我有一个文本文件,我正在将名字和姓氏读入一个大小为 20 的字符数组。我正在创建一个结构数组来保存“人物”信息。 文本文件如下所示:
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]);
}
但是,一旦我将名称输出到控制台,我就会收到以下信息:
hn Robbins
sa Jones
我进行了广泛的研究,但找不到解决此问题的方法。有没有人遇到过这个问题?
最佳答案
fscanf(dp, "%[^\n]s", &persons[i].name[20]);
这会将行读取到换行符,然后尝试读取 s
,但会失败。换行符之前的行将存储在 people 结构中的 name
数组末尾之后(这意味着它将覆盖到 persons
数组的下一个元素中。
你想要这样的东西:
fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name);
相反——初始空格会跳过前导空格(包括前一行的任何换行符。)%19[^\n]
最多读取 19 个字符或最多换行符并将其存储,后跟一个终止的 NULL(因此将用完整个 20 字节的 name
数组,但仅此而已)。 %*[^\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++;
关于c - fscanf() 读取错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25614414/