【问题标题】:Scope Issues with Filing Array with Integers使用整数归档数组的范围问题
【发布时间】:2016-03-18 18:44:03
【问题描述】:

我正在将一个二进制文件读入我的程序,我的 .dat 文件中的第一个“东西”是一个整数,它告诉我文件中有多少个孔。基本上我正在打印动物列表,如果用户决定从列表中删除动物,我将其年龄更改为 -1 并将其添加到我的“洞”中。主要问题是我认为我的程序存在范围问题,但我在 C 方面仍然相当业余。

int * countHoles(FILE *file, struct animal ani, int holesValue) {
    int i = 0;
    int * availableHoles = malloc(sizeof(int) *  100);

    for (i = 0; i < 100; i++) {
        availableHoles[i] = 0;
    }

    while (1) {
        fread(&ani, sizeof(ani), 1, file);
        if (feof(file)) {
            break;
        }
        if (ani.age < 0) {
            availabeHoles[i] = ani.id;
            printf("You found one! &d\n", availableHoles[i]);
        }
    }
    for (i = 0; i < holesValues; i++) {
        printf("availableHoles: %d\t", availableHoles);
    }
    return availableHoles;
}

所以我传入的东西是我在 main() 函数中打开的 .dat 文件,我拥有的动物结构,其中包含 ID、名称、物种、年龄、体重(不是那部分真的很重要),以及我从文件中读取的第一个整数中的孔。原始文件以 3 个孔开头,但随着用户删除动物,孔值会明显更新。在“if(ani.age

【问题讨论】:

  • 没有主要功能。或样本输入,预期输出

标签: c arrays file pointers binary


【解决方案1】:

问题在于,在您的中间循环 (while (1) { ...) 中,您使用的是 i,但从未将其设置为任何值。它以 100 的值进入该循环——它在前一个循环结束时的值——并且所有对availableHoles[i] 的写入实际上都是对availableHoles[100](实际上是堆上分配的数组之外的一个位置)。

我不太清楚你想如何填充availableHoles,但你应该在进入中间循环之前将i初始化为0,并在循环中增加一次i,或者每次你增加一次存储一个新的动物 ID。所以要么:

i = 0;
while (1) {
    ...
    if (ani.age < 0) {
        availabeHoles[i++] = ani.id;
        printf("You found one! &d\n", availableHoles[i]);
    }
}

i = 0;
while (1) {
    ...
    if (ani.age < 0) {
        availabeHoles[i] = ani.id;
        printf("You found one! &d\n", availableHoles[i]);
        ++i;
    }
}

【讨论】:

  • 啊,看看我知道这可能是小的......不是总是哈哈。太感谢了!!!你认真地救了我.. 可能是晚上剩下的时间和明天一整天!
猜你喜欢
  • 2013-02-25
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多