2013-08-18 80 views
5

我有一個實現堆棧的C程序。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

只有輸入Enter後,大多數系統上的'scanf'纔會返回。 (這稱爲行緩衝。)你在做這個嗎? – Gene

+0

@Gene yes。我嘗試了輸入和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_nodea_stack->head如此min == a_node->datemin > a_node->data總是評估false,因爲您更新了if正文中的a_node

此外,我想出你有內存泄漏函數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; 
} 

應該返回void而不是INT我想。

和handle_input()中的min_cmd未使用。

+0

贊同。代碼中使用了min_cmd和handle_input,而不是此修訂中的代碼。 – tarashish