gpt4 book ai didi

C 代码似乎放错了用 fscanf 读取的值

转载 作者:行者123 更新时间:2023-11-30 18:32:23 24 4
gpt4 key购买 nike

我编写了一个 C 程序,但它的行为方式我不理解。我发布这篇文章是希望我能更多地了解 C。代码似乎是使用 fscanf 将变量名写入其他变量,而根本没有要求它......

#include <stdio.h>
#include <stdlib.h>

int main() {
float BCL[6];
float varsRA[23],varsLA[23],varsBB[23],varsPV[23];
FILE *inputfil;
int i;

inputfil = fopen ("file.txt", "rt");
for(i=0;i<24;i++) {
fscanf(inputfil,"%f %f %f %f\n", &(varsRA[i]), &(varsLA[i]), &(varsBB[i]), &(varsPV[i]));
}

i=23;
printf("vars%d:%f %f %f %f\n",i,varsRA[i], varsLA[i], varsBB[i], varsPV[i]);

i=0;
while(!feof(inputfil)) {
fscanf(inputfil,"%f ",&(BCL[i]));
i++;
}

i=23;
printf("vars%d:%f %f %f %f\n",i,varsRA[i], varsLA[i], varsBB[i], varsPV[i]);

fclose(inputfil);
return 0;
}

结果是:

vars23:-66.336823 -68.164223 -57.850136 -60.762585
vars23:-66.336823 -68.164223 -57.850136 177.000000

当我读取文件的其余部分时,为什么 varsPV 的最后一个值更改为 177,这是 BCL 的第一个值?!

非常感谢您的帮助,玛尔塔

最佳答案

该程序具有未定义的行为,因为它访问超出了数组的范围:

for(i=0;i<24;i++) {
fscanf(inputfil,"%f %f %f %f\n", &(varsRA[i]), &(varsLA[i]), &(varsBB[i]), &(varsPV[i]));
}

数组索引从 0 运行至N - 1 ,其中N是数组中元素的数量。数组定义有 23 个元素,这意味着有效索引来自 022 。将循环终止条件更改为 i < 23或者使用编译时常量来定义数组大小和终止条件以避免重复该信息。

程序中存在其他越界访问,此循环需要防止越界:

i=0;
while(!feof(inputfil)) { /* i < 6 required */
fscanf(inputfil,"%f ",&(BCL[i]));
i++;
}

始终检查 fscanf() 的返回值以确保实际分配的任务得到落实。 fscanf()返回所做分配的数量:

for (i = 0; i < 6 && 1 == fscanf(input, "%f", &BCL[i]); i++);

关于C 代码似乎放错了用 fscanf 读取的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com