fscanf()读错误

Kry*_*ick 0 c file-io scanf

我有一个文本文件,我在第一个和最后的名字读取大小为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)

我做了大量研究,找不到解决这个问题的方法.有没有人遇到过这个问题?

Chr*_*odd 5

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)