제가 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;
}
}
}