c언어 반복문과 scanf 에러문제

조회수 284회

제가 c언어로 트리를 1차원 배열로 구현하려고 프로그램을 작성하다가 for문에서 반복이 종료되지 않고 계속해서 scanf를 실행되는 상황이 벌어지고 있습니다.

제가 올린 코드에서는 논리적 에러가 없어 보이고 문법적 에러는 dev c에서 컴파일을 진행할 시 뜨지 않습니다. 제가 에러지점을 주석으로 처리해서 에러지점을 표시하겠습니다.

이번 에러는 아마도 버퍼 에러이거나 혹은 컴파일러가 코드 최적화를 진행하던 와중에 문제가 발생한 것 같습니다. 하지만 저도 어디서 어떻게 컴파일러가 코드 최적화를 진행했는지 몰라서 질문 드립니다. 죄송합니다 문제를 풀었습니다. 해결방법은 걍 배열의 크기를 250000에서 300000으로 바꾸어 주고 배열 C와 A를 long long형태로 바꾸어 주는 것이 였습니다.

#include<stdio.h>

int N[250000];//Node

int C[250000]; //Count

int T[250000]; //Temp

int S[250000]; //Set


int E[250000]; //Exist

int A[250000]; //Answer

void Show_N(int (*));

int main(int argc, char **argv){

    int n;
    int a;
    int i;
    int event;
    int v1, v2;
    scanf("%d", &n);
    n--;
    a = 0;
    for( ; ; ){
        scanf("%d %d", &v1, &v2);
        if(*(N + v1) != 0){
            event = 0;
            i = 0;
            *(T + i) = v1;
            i++;
            *(T + i) = *(N + v1);
            for( ; ; ){
                if(event == 0){
                    if(*(N + *(T + i)) != 0){
                        i++;
                        *(T + i) = *(N + *(T + i - 1));
                    }
                    else{
                        event = 1;
                    }
                }
                if(event == 1){
                    *(N + *(T + i)) = *(T + i - 1);
                    *(N + *(T + i - 1)) = 0;
                    *(T + i) = 0;
                    i--;
                    if(i == 0){
                        *(T + i) = 0;
                        break;
                    }
                }
            }
        }
        *(N + v1) = v2;
        a++;
        if(a == n){
            break;
        }
    }
//  Show_N(N);

    int q = 0;
    int s = 0;
    int temp;
    scanf("%d", &q);
    event = 0;
    a = 0;
    for( ; ; ){
        if(event == 0){
            s = 0;
            scanf("%d", &s);
            event = 1;  
        }
        if(event == 1){
            i = 0;
            for( ; ; ){
      /*에러지점 -> 입력값을 복사 붙여 넣기를 하면 입력이 다 되었는데도 for문이 종료돼 
        지 않거나 중간에 입력을 하다가 멈추고 계속 입력을 받도록 됨*/
                scanf("%d", &*(S + i));
                *(E + *(S + i)) = 1;            
                i++;
                if(i == s){
                    break;
                }
            }
            event = 2;
        }
        if(event == 2){
            i = 0;
            temp = *(S + i);
            for( ; ; ){
                if(*(E + *(N + temp))){
                    temp = *(N + temp);
                }
                else{
                    *(C + temp) += 1;
                    i++;
                    temp = *(S + i);
                    if(i == s){
                        break;
                    }
                }
            }
            event = 3;
        }
        if(event == 3){
            i = 0;
            for( ; ; ){
                *(A + a) += *(C + i) * (*(C + i) - 1) / 2;
                *(C + i) = 0;
                *(E + i) = 0;
                i++;
                if(i == 250000){
                    break;
                }
            }
            event = 4;
        }
        if(event == 4){
            a++;
            if(a == q){
                a = 0;
                for( ; ; ){
                    printf("%d\n", *(A + a));
                    a++;
                    if(a == q){
                        break;
                    }
                }
                break;
            }
            event = 0;
        }
    }
    return 0;
}

void Show_N(int (*N)){

    int i = 0;

    for( ; ; ){
        if(*(N + i) != 0){
            printf("N[%d] = %d\n", i, *(N + i));
        }
        i++;
        if(i == 250000){
            break;
        }
    }
}

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)