2013-08-18 5 views
5

스택을 구현하는 C 프로그램이 있습니다. I 배열의 최소의 요소를 계산하기위한 명령 인 '분'을 입력하려면C 프로그램이 scanf에서 영원히 기다립니다.

#include <stdio.h> 
#include <stdlib.h> 


struct node{ 
    int data; 
    struct node *link; 
}; 

struct stack{ 
    struct node *head; 
    struct node *data_node; 
}; 

int push(struct stack *a_stack, int i){ 
    a_stack->data_node = malloc(sizeof(struct node)); 
    if(a_stack->data_node == NULL){ 
     puts("Error: Cannot allocate sufficient memory."); 
     exit(1); 
    } 
    a_stack->data_node->data = i; 
    a_stack->data_node->link = a_stack->head; 
    a_stack->head= a_stack->data_node; 
    return 0; 
} 

int pop(struct stack *a_stack){ 
    if(a_stack->head==NULL){ 
     return '\n'; 
    } 
    int temp = a_stack->head->data; 
    a_stack->data_node = a_stack->head; 
    a_stack->head = a_stack->head->link; 
    free(a_stack->data_node); 
    return temp; 
} 

int minimum(struct stack *a_stack){ 
    if(a_stack->head==NULL){ 
     return '\n'; 
    } 
    int min = a_stack->head->data; 
    struct node *a_node = a_stack->head; 
    while(a_node!=NULL){ 
     if(min>a_node->data){ 
      min = a_node->data; 
      a_node = a_node->link; 
     } 
    } 
    return min; 
} 

int init_stack(struct stack *a_stack){ 
    a_stack->head = NULL; 
    a_stack->data_node = NULL; 
} 

int handle_input(struct stack *test){ 

    char* input_string = (char*)malloc(20); 
    scanf("%s", input_string); 
    // gets(input_string); 

    char* pop_cmd = "-"; 
    char* min_cmd = "min"; 
    int num; 

    if (strcmp(pop_cmd, input_string) == 0){ 
     printf("%d\n", pop(test)); 
    } 

    else{ 
     if (input_string[0] == 'm'){ 
      printf("%d\n", minimum(test)); 
     } 
     else{ 
      num = atoi(input_string); 
      push(test, num); 
     } 
    } 

    return 0; 
} 


int main(void){ 

    int no_of_input, counter; 

    struct stack test; 
    init_stack(&test); 

    scanf("%d", &no_of_input); 

    for(counter=no_of_input; counter>0; counter=counter-1){ 
     handle_input(&test); 
    }; 

    return 0; 
} 

문제는, 프로그램은 입력에 영원히 기다린다. 꽤 오래 동안 주위를 검색 한 후에도 왜 이런 일이 일어나는지 알 수 없습니다.

+0

handle_input 메소드에서 char 포인터를 사용하고 있기 때문에 맞습니까? char * input_string = (char *) malloc (20); scanf ("% s", input_string); – user2277872

+0

대부분의 시스템에서'scanf'는 Enter 키를 누르기 전까지는 반환되지 않습니다. (이것을 라인 버퍼링이라고합니다.) 당신은 그렇게하고 있습니까? – Gene

+0

@Gene 예. 나는 입력하고 Ctrl + D를 시도했다. 그러나 아직도 아무것도. – tarashish

답변

4

scanf가 대기하지 않지만 무한 루프 문제가 있습니다. 기능 minimum()에서, 당신은 단지 조건에 링크 된 목록에 다음 노드로 a_node를 업데이트

int min = a_stack->head->data; //note 
    struct node *a_node = a_stack->head; //note 

    while(a_node!=NULL){ 
     if(min > a_node->data){<-- "Always evaluates FALSE because: min is a_node->data" 
      min = a_node->data; 
      a_node = a_node->link; <--"Should NOT be here" 
     } 
     a_node = a_node->link; <--"but it should be here" 
    } 

또한, if 조건 (min > a_node->data)은 항상 때문에 이유 false 평가 :

mina_stack->head->dataa_node 그렇게 a_stack->headmin == a_node->date입니다 min > a_node->dataa_nodeif 본문으로 업데이트했기 때문에 항상 false을 평가합니다.

또한 의 메모리 누수가이고 handle_input() 인 것으로 나타났습니다. free() 동적으로 메모리를 명시 적으로 할당해야합니다. 또한

int handle_input(struct stack *test){ 
    char* input_string = malloc(20); <-- "No need to type case" 
    // code here 
    free(input_string); <-- "Add this" 
    return 0; 
} 
+0

그래, 그게 다야. 꽤 어리석은. 허용 될 때 ~ 5 분 내에 답변을 수락합니다. 고마워요 :) – tarashish

+0

@ tarashish 더 많은 이유가 기다려, 이제 업데이트 된 대답을 읽어보십시오. –

+0

하지만 첫 번째 문제를 해결하면 두 번째 경우가 자동으로 해결됩니다. – tarashish

0

에 : 아래에있는 내 제안 읽기

int init_stack(struct stack *a_stack){ 
    a_stack->head = NULL; 
    a_stack->data_node = NULL; 
} 

을 대신 내 생각 INT의 무효 반환해야합니다.

handle_input()의 min_cmd는 사용되지 않습니다.

+0

동의 함. min_cmd 및 handle_input은 코드에서 사용되며이 개정판에서는 사용되지 않습니다. – tarashish

관련 문제