我有一个文本文件,我将首字母和姓氏读入一个大小为20的字符数组。我正在创建一个结构数组,其中包含"人物' s&# 34;信息。 文本文件如下所示:
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
我做过广泛的研究,无法找到解决这个问题的方法。有没有人遇到过这个问题?
答案 0 :(得分:5)
fscanf(dp, "%[^\n]s", &persons[i].name[20]);
这会将行读取到换行符,然后尝试读取将失败的s
。新行的行将存储在人员结构中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++;