2017-11-30 2 views
0

사용자로부터받은 숫자로 int 배열을 채우려고합니다.scanf와 EOF를 올바르게 사용하는 방법은 무엇입니까?

그러나 더 큰 특정 색인 printf을 시도하면 잘못된 번호가 표시됩니다.

for(B_index=0,checker=0; B_index<SIZE&&!checker; B_index++) 
    { 

     checker=scanf("%d",&B[B_index]); 

     if(checker==EOF) 
     { 
      checker=1; 
     } 

     else if(checker<1) 
     { 
      printf("error"); 
      return 1; 
     } 

    } 
    printf("%d",B[1]); 
+0

이것은 C 배열이 바운드 검사를 수행하지 않는 것입니다. 즉, 배열의 요소에 대한 액세스가 배열의 바깥에 있는지 여부를 컴파일러가 확인하지 않기 때문입니다. 왜? 두 가지 이유 : 1. 런타임시 C 배열이 포인터로 변환되므로 배열의 요소에 액세스 할 때마다 포인터 산술 연산을 수행하는 것과 같습니다. 2. 언어에 더 많은 속도를 제공하기 때문에 안정성과 속도 사이에 트레이드 오프입니다. –

답변

1

scanf와 다시 할당의 수를 반환하므로 콘솔 유효한 정수를 입력 한 경우는 scanf [0] B로 (인해 % (D)에)는 정수가 할당 즉, 1을 반환한다. 이렇게하면 체커가 1이되어 첫 번째 숫자가 입력 된 직후에 루프가 중단됩니다. B [1]은 할당되지 않은 상태이므로 가비지가 포함되거나 어레이를 지우면 0이됩니다.

+0

고맙습니다. – gabi939

관련 문제