2013-01-30 1 views
-1

이해할 수없는 방식으로 작동하는 C 프로그램을 작성했습니다. 나는 ... 나는 코드가 전혀 그것을 물어 보지 때 fscanf를 사용하여 다른 변수에 변수 이름을 쓰는 것 같다 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의 마지막 값이 나는 파일의 나머지 부분을 읽을 때, BCL의 첫 번째 값 인 177으로 변경되었습니다! N이 어디

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

배열 인덱스, 0에서 N - 1에 실행이 배열의 경계를 넘어 액세스하는 귀하의 도움을

많은 감사, 마르타

답변

3

이 프로그램은 동작이 보증되지 배열의 요소 수 배열은 23 개의 요소로 정의됩니다. 유효한 인덱스는 0에서 22까지입니다. 루프 종료 조건을 i < 23으로 변경하거나 컴파일 시간 상수를 사용하여 배열 크기 및 종료 조건을 정의하여 해당 정보가 중복되지 않도록하십시오.

가 범위 밖으로 다른 프로그램에 액세스하고이 루프가 경계의 외출에서 보호를 필요가 있습니다

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

항상 과제가 실제로 만들어졌다 보장하기 위해 fscanf()의 반환 값을 확인합니다. fscanf() 반환했다 과제의 수 : C에서

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

배열 인덱스는 0부터 시작.

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

그 배열은 23 개 원소를 만들어 자신의 마지막 유효 인덱스 등 (22)이있다. 그 이유는

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

각각에 하나의 요소를 씁니다. 당신이 얻는 것은 정의되지 않은 행동입니다 (따라서 기대할만한 것은 없습니다). 그러나 여러분의 미정의 행동은 다른 배열 (그리고 아마 임의의 메모리 위치)을 덮어 쓰는 것입니다.

+0

모든 답변 주셔서 감사합니다. 나는 지금 Matlab에 익숙하다. C의 제로 인덱스는 항상 나를 던진다. – user1760043

1

배열이 충분히 커지지 않습니다. 배열 varsRA[23]에는 0부터 22까지 23 개의 요소 만 포함됩니다. 번호가 0부터 23까지입니다. 배열 정의를 다음과 같이 변경하면 좋을 것입니다.

float varsRA[24],varsLA[24],varsBB[24],varsPV[24]; 
관련 문제