2013-08-18 19 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

ほとんどのシステムで '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->dataは、a_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

@タラシッシュもう一つの理由を待って、今更新された答えをお読みください。 –

+0

しかし、最初の問題を修正すると、自動的に – tarashish

0

また、中:

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

それは代わりに私が思うint型のvoidを返す必要があります。

handle_input()のmin_cmdは使用されません。

+0

はい合意。 min_cmdとhandle_inputはこのリビジョンではなく、コード内で使用されています。 – tarashish

関連する問題