2017-10-21 7 views
2
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    unsigned int n0; 

    scanf("%d", &n0); 
    const unsigned int n = n0; 
    short unsigned int A[n]; 
    short unsigned int d, x, y, k; 
    short int l, r; 
    int i, j; 

    for (i = 0; i < n; i++) { 
     scanf("%d", &A[i]); 
    } 

    scanf("%d", &d); 
    for (i = 1; i <= d; i++) { 
     scanf("%d %d", &x, &y); 
    } 
    return 0; 
} 

안녕하세요, 저는 C가있는 전체 초보자이며 나에게 많은 것을 놀라게 한 상황을 우연히 발견했습니다. 위의 코드에서 사용자에게 숫자 d을 입력 한 다음 d 쌍의 점 좌표를 입력하라고합니다. 그러나 놀랍게도, 처음에 1보다 큰 값인 d이 무엇이든간에 (x, y)의 첫 번째 쌍을 입력 한 후에 프로그램이 실행을 종료합니다. 코드에 d 값을 할당하면 발생하지 않습니다 (e.x. d = 5;). 이유는 무엇일까요? scanf 문을 통해 변수에 할당 된 값이 어떻게 다르고 루프 상태에서 사용할 수 없습니까?scanf를 사용하여 변수 입력이있는 루프 조건 - C

+0

하는 일이'(I = 0; i가 N <; 내가 ++)에 대한? { 는 scanf ("% d 개", &A[i]); 가}'을 의미 –

+0

@xing, 그것은 일, 감사! 그런데 왜 실제로 % D 아무튼 – jakes

+0

@KrzysztofSzewczyk, 더 많은 기능을 위해 무언가입니다. 여기를 삭제하는 것을 잊었습니다. – jakes

답변

1

코드를 컴파일 할 때 발생하는 경고에주의하십시오. 다음과 같이 경고 중 하나가되어야합니다 :

%d 원인 scanf를 사용
a.c:19:12: warning: format specifies type 'int *' but the argument has type 
    'unsigned short *' [-Wformat] 
scanf("%d",&d); 
     ~~ ^~ 
     %hd 

은 정의되지 않은 동작으로 이어지는, int에 대한 포인터로 short에 대한 포인터를 캐스팅. 귀하의 경우처럼 에 int의 윗부분이 저장되고 아래쪽 부분은 떨어졌습니다. 숫자 undef의 경우 2 위 부분은 0이므로 후속 루프는 0 번 반복합니다. 이 문제를

scanf("%hu", &d); 
... // Fix other scanf calls as well. 

주를 제거하는 모든 경고를 해결

는 : 루프 변수 short을 만들기위한 좋은 이유가 없다.

+1

철저한 설명에 감사드립니다! – jakes