c - fscanf() 读取错误

标签 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", &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/

相关文章:

c - 更改字符串数组中的偶数和奇数字符

c - 如何计算树形图的所有可能排列

python - c/Python 等价于这样的循环?

c - fprintf 后文件指针设置为 NULL

c - 来自两个不同文件的 fscanf

c - scanf用数组格式化多个特殊字符

c - 在 ')' token 之前应为 '*',似乎找不到错误

java - 扫描 jtextfield 进行输入,写入文本文件,再次扫描新输入,直到用户关闭面板

java - 如何借助 JFileChooser <将选定的 jpeg 图像文件> 移动到 java swing 中选定的文件夹?

c - 从 C 中具有不同数据类型的文件中读取特定行