我有一个文本文件,我在第一个和最后的名字读取大小为20的字符数组.我正在创建一个结构数组,其中包含"人民"的信息.文本文件如下所示:
John Robbins
Teresa Jones
Run Code Online (Sandbox Code Playgroud)
我的结构定义如下:
struct people {
char name[20];
};
Run Code Online (Sandbox Code Playgroud)
人员宣言结构:
struct people *persons[2];
Run Code Online (Sandbox Code Playgroud)
声明新结构后,我使用以下代码读取名称:
for(i=0; i<2; i++)
{
fscanf(dp, "%[^\n]s", &persons[i].name[20]);
}
Run Code Online (Sandbox Code Playgroud)
但是,一旦我将名称输出到控制台,我收到以下内容:
hn Robbins
sa Jones
Run Code Online (Sandbox Code Playgroud)
我做了大量研究,找不到解决这个问题的方法.有没有人遇到过这个问题?
fscanf(dp, "%[^\n]s", &persons[i].name[20]);
Run Code Online (Sandbox Code Playgroud)
这s会将行读取到换行符,然后尝试读取将失败的行.直到换行符的行将存储在name人员结构中数组结尾之后(这意味着它将覆盖到persons数组的下一个元素中).
你想要的东西:
fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name);
Run Code Online (Sandbox Code Playgroud)
相反 - 初始空间跳过前导空格(包括前一行的任何换行符.)%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++;
Run Code Online (Sandbox Code Playgroud)