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

C代码似乎错误放置了使用fscanf读取的值,c,variables,variable-assignment,scanf,C,Variables,Variable Assignment,Scanf,我写了一个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 = fop

我写了一个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;
}
当我阅读文件的其余部分时,为什么varsPV的最后一个值更改为177,这是BCL的第一个值

非常感谢你的帮助,
Marta

程序在访问数组边界之外时有未定义的行为:

for(i=0;i<24;i++) {
    fscanf(inputfil,"%f %f %f %f\n", &(varsRA[i]), &(varsLA[i]), &(varsBB[i]), &(varsPV[i]));
}
始终检查
fscanf()
的返回值,以确保实际进行了分配
fscanf()
返回分配的数量:

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

C中的数组索引是基于零的

float varsRA[23],varsLA[23],varsBB[23],varsPV[23]
这些数组的最后一个有效索引是22,它包含23个元素。这就是为什么

for(i=0;i<24;i++)

for(i=0;i您的数组没有被定义得足够大。数组
varsRA[23]
只包含编号为
0
22
的23个元素。您正在读取编号为
0
23
的24个元素。将数组定义更改为以下内容,您就可以开始了

float varsRA[24],varsLA[24],varsBB[24],varsPV[24];

谢谢所有的答案。我现在已经习惯了Matlab,C的零索引总是让我。。。
for(i=0;i<24;i++)
float varsRA[24],varsLA[24],varsBB[24],varsPV[24];