2013-08-18 46 views
5

Tôi có một chương trình C triển khai một ngăn xếp.Chương trình C chờ mãi mãi trên 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; 
} 

Vấn đề là nếu tôi muốn nhập 'phút' là lệnh để tính toán yếu tố tối thiểu của mảng, chương trình sẽ đợi mãi khi nhập. Sau khi tìm kiếm trong một thời gian khá lâu, tôi vẫn không biết tại sao điều này lại xảy ra.

+0

nó sẽ là vì bạn đang sử dụng một con trỏ char bên trong phương thức handle_input của bạn? char * input_string = (char *) malloc (20); scanf ("% s", input_string); – user2277872

+0

'scanf' trên hầu hết các hệ thống sẽ không trở lại cho đến khi bạn nhập Enter. (Điều này được gọi là dòng đệm.) Bạn đang làm điều đó? – Gene

+0

@Gene yes. Tôi đã thử nhập và Ctrl + D. Nhưng vẫn không có gì. – tarashish

Trả lời

4

Tệp quét không đợi nhưng bạn có vòng lặp vô hạn sự cố. Trong chức năng minimum(), bạn chỉ có điều kiện cập nhật a_node đến nút tiếp theo trong danh sách liên kết:

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" 
    } 

Ngoài ra, if trạng (min > a_node->data) luôn đánh giá false vì lý do:

mina_stack->head->dataa_nodea_stack->head nên min == a_node->datemin > a_node->data luôn đánh giá false vì bạn đã cập nhật a_node trong cơ thể if.

Ngoài ra tôi đã phát hiện ra rằng bạn có rò rỉ bộ nhớ trong chức năng handle_input(). Bạn nên free() bộ nhớ được cấp phát động một cách rõ ràng. Đọc gợi ý của tôi dưới đây:

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

Yup, đúng vậy. Khá ngớ ngẩn. Tôi sẽ chấp nhận câu trả lời của bạn trong ~ 5 phút khi tôi được phép. Cảm ơn :) – tarashish

+0

@tarashish một lý do khác chờ đợi, bây giờ đọc câu trả lời cập nhật. –

+0

Nhưng khắc phục vấn đề đầu tiên tự động giải quyết trường hợp thứ hai tôi đoán – tarashish

0

Ngoài ra, trong:

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

Nó nên trả về void thay vì int tôi nghĩ.

và min_cmd trong handle_input() không được sử dụng.

+0

đồng ý. min_cmd và handle_input được sử dụng trong mã, không có trong bản sửa đổi này. – tarashish

Các vấn đề liên quan