-1

我写了一个 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 的第一个值?!

非常感谢你的帮助,玛塔

4

3 回答 3

3

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

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

数组索引从0N - 1,其中N是数组中元素的数量。数组定义有 23 个元素,这意味着有效索引是 from022。将循环终止条件更改为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++);
于 2013-01-30T16:34:02.937 回答
1

您的数组定义不够大。该数组varsRA[23]仅包含 23 个元素,编号022. 您正在阅读编号为 的24元素。将您的数组定义更改为以下内容,您应该一切顺利。023

float varsRA[24],varsLA[24],varsBB[24],varsPV[24];
于 2013-01-30T16:35:05.920 回答
0

C 中的数组索引是从零开始的。

float varsRA[23],varsLA[23],varsBB[23],varsPV[23]

这些数组有 22 作为它们的最后一个有效索引,即 23 个元素。这就是为什么

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

向它们中的每一个写入一个额外的元素。您得到的是未定义的行为(因此没有任何合理的期望),但是您特定的未定义行为是覆盖另一个数组的一部分(可能还有一些随机内存位置)。

于 2013-01-30T16:35:02.383 回答