c - fscanf/fscanf_s 覆盖数组

标签 c scanf

我正在尝试使用 fscanf 加载结构数组的一些默认值,它看起来像

#define NUMPIECES 21
typedef struct{
    short map[5][5];
    short rotation;
    short reflection;
} mytype_t;
typedef struct{
    mytype_t p[NUMPIECES];
} mytypelist_t;

数据存储在文本文件中,如下所示(使用不同的值重复多次):

0 0 0 0 0
0 0 0 0 0 
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
1 2
[...]

我正在使用 fscanf/fscanf_s(都试过)读取值,如下所示:

mytypelist_t list;
FILE * f;
[...]
for (i=0; i<NUMPIECES; i++){
    for (j=0; j<5; j++){
        fscanf(f,"%d%d%d%d%d", &(list->p[i].map[j][0]),
                                &(list->p[i].map[j][1]),
                                &(list->p[i].map[j][2]),
                                &(list->p[i].map[j][3]),
                                &(list->p[i].map[j][4]));
    }
    fscanf(f,"%d %d", &(list->p[i].rotations), &(list->p[i].reflection));
}

但是,VS2012 最后抛出异常,说列表已损坏。调试显示,在读取上面示例文本的前四行后,结构的“map”部分包含以下内容

map = [ 0 0 0 0 0 ]
      [ 0 0 0 0 0 ]
      [ 0 0 1 0 0 ]
      [ 0 0 0 0 0 ]
      [ 0 X X X X ]

其中 X 是未初始化的值。

看起来好像 fscanf 正试图“空终止”我的整数数组或类似的数组,并且正在覆盖后续行的第一个元素。我只是发现它是因为 VS 在退出时抛出异常 - 否则数据会被完美读取(额外的 0 会被下一个 fscanf 调用覆盖)。

这是 fscanf 的副产品吗?还是我忽略了一个错误?

(在 VS2012 上编译/测试)

最佳答案

我认为 fscanf 试图在您向它提供指向短裤的指针时填充整数。 fscanf 不知道它填充的字段的实际类型 int;它依赖于格式说明符。我不知道任何“短”格式说明符。所以我要么将您的数据字段更改为整数,要么扫描为整数,然后复制到您的数据结构中的短裤

关于c - fscanf/fscanf_s 覆盖数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29504163/

相关文章:

c - 使用 fscanf 从包含整数数组的文件中读取

c - 文件读写C

c - 如何在 scanf 中只接受一定的精度(这么多小数位)?

c - 如何在 Linux 上为 gcc 制作一个简单的 makefile?

c - C 代码的缓冲区溢出错误

c - 以下代码试图演示什么?

c - 如何创建头文件和文件处理

c++ - C/C++ 中有自然数的基本类型吗?

c - 编写一个程序来找出一系列数字中最大的一个。

c - 程序重复出现问题