2013-08-18 9 views
5

Ich habe ein C-Programm, das einen Stapel implementiert.C Programm wartet immer auf 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; 
} 

Das Problem ist, wenn I eingeben ‚min‘ will, das der Befehl für das kleinste Element des Arrays zu berechnen, wartet das Programm immer auf Eingabe. Nach langem Suchen habe ich immer noch keine Ahnung, warum das so ist.

+0

wäre es, weil Sie einen Char-Zeiger innerhalb Ihrer handle_input-Methode verwenden? char * Eingabezeichenfolge = (char *) malloc (20); scanf ("% s", Eingabezeichenfolge); – user2277872

+0

'scanf' auf den meisten Systemen wird erst wieder angezeigt, wenn Sie Enter eingeben. (Dies wird als Zeilenpufferung bezeichnet.) Machst du das? – Gene

+0

@Gene ja. Ich habe versucht, Enter und Strg + D. Aber immer noch nichts. – tarashish

Antwort

4

Die scanf nicht warten, aber Sie haben Endlosschleife Problem. In Funktion minimum(), aktualisieren Sie nur bedingt a_node zum nächsten Knoten in verketteten Liste:

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

Auch if Zustand (min > a_node->data) ist wertet immer false, weil der Grund:

min ist a_stack->head->data und a_node ist a_stack->head so min == a_node->date und min > a_node->data wertet immer false aus, weil Sie a_node in if Körper aktualisiert haben.

Zusätzlich habe ich herausgefunden, dass Sie Speicherverlust in der Funktion handle_input() haben. Sie sollten free() Speicher dynamisch explizit zugewiesen. Lesen Sie meinen Vorschlag unter:

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, das ist es. Ziemlich dumm. Ich werde Ihre Antwort in ~ 5 Minuten akzeptieren, wenn ich erlaubt bin. Danke :) – tarashish

+0

@Tarashish noch ein Grund warten, lesen Sie jetzt aktualisierte Antwort. –

+0

Aber das erste Problem zu beheben löst automatisch den zweiten Fall Ich denke, – tarashish

0

Auch in:

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

Es sollte leer kommen statt int denke ich.

und min_cmd in handle_input() ist nicht verwendet.

+0

ja zugestimmt. min_cmd und handle_input werden im Code verwendet, nur nicht in dieser Revision. – tarashish